我们的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
有人可以为此提供任何解决方案吗?
答案 0 :(得分:2)
您需要创建一个描述符 - sqlda
描述符(请参阅DESCRIBE
和sqlda.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
之前不包括冒号的语法怪异。
如果您需要代码来说明这些内容,那么:
dbdimp.ec
)使用SQL DESCRIPTOR。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;