如何在Informix ESQL / C中“使用”动态提供值?

时间:2011-09-08 14:54:05

标签: c informix

我们的Informix ESQL / C(.ec)程序使用查询:

select count(*) from <table> where col >= val1 and col <= val2 

在我们使用的程序中:

select count(*) from <table> where col >= ? and col <= ? 

现在,新要求是我们需要根据值列表进行搜索。该列表是动态生成的,我们不确定列表的大小。如果列表包含2列,则查询将如下:

select count(*) from <table> where ((col >= ? and col <= ?) OR (col >= ? and col <= ?))

我们能够构建查询框架,但我们不确定如何执行此操作。

目前的执行情况如下:

exec sql execute :select_prepare using :val1, :val2

我们在整数数组中包含所有值。由于我们不确定参数的数量,因此我们陷入了准备执行语句的困境。

以下命令不起作用

exec sql execute :select_prepare using :val_array 

有人可以为此提供任何解决方案吗?

2 个答案:

答案 0 :(得分:2)

您需要创建一个描述符 - sqlda描述符(请参阅DESCRIBEsqlda.h)或SQL DESCRIPTOR。我倾向于说“使用sqlda描述符更容易”,但(在第二个想法中)我不确定这是真的。

使用SQL描述符,您将使用:

ALLOCATE DESCRIPTOR
DEALLOCATE DESCRIPTOR
GET DESCRIPTOR
SET DESCRIPTOR

使用sqlda,您可以使用DESCRIBE获取信息,或者您可以自己制作描述符。

无论如何,最终结果将是你写的:

EXEC SQL EXECUTE :select_prepare USING SQL DESCRIPTOR :name;

EXEC SQL EXECUTE :select_prepare USING DESCRIPTOR sqlda_info;

请注意在sqlda_info之前不包括冒号的语法怪异。

如果您需要代码来说明这些内容,那么:

  • DBD::Informix(Perl模块,主要是源文件dbdimp.ec)使用SQL DESCRIPTOR。
  • SQLCMD(原来的,不是微软的约翰尼最近版本)使用sqlda

在这两种情况下,搜索DESCRIPTOR(大写)会为您提供正确指向的强大指针。

(我注意到您仍然需要动态准备SQL;除非您使用@RET建议的临时表,否则SQL的文本将根据您需要测试的范围数量而有所不同。)

答案 1 :(得分:2)

这确实很尴尬。 <啊>啊,乔纳森带着明确的答案到了。但是,我的建议是左栏选择。

你可以解决这个问题的一种方法是沿着这些方向做一些事情: NB:未经测试,概念性代码如下

CREATE TEMP TABLE ranges (
    lo INT,
    hi INT
);

for(..){
    INSERT INTO ranges (?,?) USING :var1, :var2;
}

SELECT COUNT(DISTINCT id) FROM table, ranges WHERE col BETWEEN lo AND hi

/* later.. */

DROP TABLE ranges;