如何指定在PRO * C查询变量表达式列表?
-
20-09-2019 - |
题
我有一个PRO * C查询我试图优化问题。
要解释一下,我们的应用程序搜索的一个庞大的数据库行。这些行的几种语言存在和旧代码选择的行用于在阵列中的每个的语言。现在,作为这些查询消耗我们的应用程序的一部分,大部分时间,我想让只有一个查询直接写在数组中。
在语言代码是2字母的ISO-639码(en代表英语,fr表示法语)。
旧方式(这仅是一个简化的代码来显示的意图)
struct ROW arr[MAX_LAN];
struct ROW_IND arr_ind[MAX_LAN];
uint_t LanIdx;
for(LanIdx=0; LanIdx<MAX_LAN; LanIdx++) {
EXEC SQL SELECT * /* Don't look at the *, it's for obfuscation only */
INTO :arr[LanIdx]:arr_ind[LanIdx]
FROM table WHERE id=:uniqid AND language=:LanCode[LanIdx];
}
我愿做这样的事情:
EXEC SQL SELECT * /* Don't look at the *, it's for obfuscation only */
INTO :arr:arr_ind
FROM table WHERE id=:uniqid AND language IN (:LanCodes);
但不知道我应该如何定义LanCodes。
它与一个常数(编译时间)列表这样
EXEC SQL SELECT * /* Don't look at the *, it's for obfuscation only */
INTO :arr:arr_ind
FROM table WHERE id=:uniqid AND language IN ('en','fr','de');
,但这不是有用的,因为语言可能会发生变化,从情况而定。
如果我写类似
char LanCodes[MAX_LANS*5];
sprintf(LanCodes, "%s", LanCode[LanIdx]);
EXEC SQL SELECT * /* Don't look at the *, it's for obfuscation only */
INTO :arr:arr_ind
FROM table WHERE id=:uniqid AND language IN (:LanCodes);
它只能如果在字符串中1个语言代码。
所以我的问题是,没有任何人知道如何使这项工作? Oracle文档是如此之大,我不知道在哪里看。我尝试不同的方法,但没有奏效。
修改强> 好吧,我发现了一个可行的解决方案。这不是优雅,这不是先进的,但它工作得很好。我把OR子句的列表我的查询和返回结果是什么,我需要在我需要的形式。
EXEC SQL SELECT * /* Don't look at the *, it's for obfuscation only */
INTO :arr:arr_ind
FROM table WHERE id=:uniqid AND (
language=:v1[ 0] OR
language=:v1[ 1] OR
language=:v1[ 2] OR
language=:v1[ 3] OR
language=:v1[ 4] OR
language=:v1[ 5] OR
language=:v1[ 6] OR
language=:v1[ 7] OR
language=:v1[ 8] OR
language=:v1[ 9] OR
language=:v1[10] OR
language=:v1[11] OR
language=:v1[12] OR
language=:v1[13] OR
language=:v1[14] OR
language=:v1[15] OR
language=:v1[16] OR
language=:v1[17] OR
language=:v1[18] OR
language=:v1[19] OR
language=:v1[20] OR
language=:v1[21] OR
language=:v1[22] OR
language=:v1[23] OR
language=:v1[24] OR
language=:v1[25] OR
language=:v1[26] OR
language=:v1[27] OR
language=:v1[28] OR
language=:v1[29] OR
language=:v1[30]);
它的速度更快时,有2周以上的语言,所以我把这种变体或旧取决于语言获取数。
解决方案
这大概 AskTom文章可以帮助你。
其他提示
您不能没有做到这一点甲骨文动态SQL 的。你必须建立在运行时你的IN子句和EXECUTE IMMEDIATE。至少你可以使用方法1,根据您的查询。
我使用了一个由一个ID和一组行的前其中的行是可能的值中的“中的”列表中的置换表。然后我加入到基于该表 ID,这让我我需要的结果。
create table permute (
id number,
lang char(2)
);
create index permute_p1 on permute ( lang, id );
insert into permute ( id, lang ) values ( 1, 'en' );
insert into permute ( id, lang ) values ( 2, 'en' );
insert into permute ( id, lang ) values ( 2, 'fr' );
...
所有您需要做的就是选择正确的“ID”值2,3,4 ...和它放入 加入。
... 主串:= 'SELECT * FROM表WHERE ID =:uniqid和语言'; - 可以分成两器。---:uniqd ... 选择LANGUAGE_CODE到v_string 从x_table; 环 复制和Concat的v_string到LanCode_String与“”; END LOOP; .. CONCAT Lancode主字符串。 .. 准备和执行的主串。