gpt4 book ai didi

c - 如何在 Pro*C 查询中指定变量表达式列表?

转载 作者:行者123 更新时间:2023-11-30 14:31:15 25 4
gpt4 key购买 nike

我尝试优化的 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 article可以帮助你。

关于c - 如何在 Pro*C 查询中指定变量表达式列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1749691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com