我看到了另一个关于将集合数据类型推送到c#代码的问题,但它并没有真正回答我想要做的事情。
我正在尝试使用select将列表数据类型传递给SPL。我知道在SPL中可以这样定义和设置列表:
DEFINE a LIST(INTEGER NOT NULL);
LET a = LIST{(SELECT unique b from numberTable)};我还知道,如果SPL的变量是LIST,则可以将list发送到SPL。
execute procedure someProc(LIST{1,2,3});了解了这两件事后,我想尝试从SELECT为变量创建一个列表。
execute procedure someProc(LIST{(SELECT unique b from numberTable)});所以我创建了一个小的测试用例。
create table tab1 (a int);
insert into tab1 values (1);
insert into tab1 values (2);
insert into tab1 values (3);
create procedure retInt(c LIST(INTEGER NOT NULL))
RETURNING INTEGER;
DEFINE b INTEGER;
FOREACH SELECT * INTO b from TABLE(c)
return b with RESUME;
end FOREACH
end procedure;
-- Works
execute procedure retInt(LIST{1,2,3});
-- Doesn't work
-- returns 284: A subquery has returned not exactly one row.
execute procedure retInt(LIST{(SELECT a from tab1)});我还尝试了像这样对select进行类型转换
execute procedure retInt((SELECT a from tab1)::LIST(INTEGER NOT NULL));不用说,这造成了语法错误。
我可能正在尝试做一些不可能的事情。浏览IBM的文档时,我没有找到任何东西,但是有时我觉得他们的文档可能很难使用。
有什么想法吗?
先谢谢你,卡顿
发布于 2015-12-22 03:16:44
在Informix中,您不能直接从SELECT语句构建列表,除非select恰好返回1行。我怀疑在您给出的示例中,查询恰好返回1行,并且创建了列表。
Informix不允许从返回多行的SELECT创建列表,但它接受从返回多行的SELECT创建多集,然后可以将这些行转换为列表。
EXECUTE PROCEDURE retInt((MULTISET(SELECT ITEM a FROM tab1)::LIST(INTEGER NOT NULL)));要创建多个整数值,而不是多个行值,关键字ITEM是必需的。
https://stackoverflow.com/questions/34363383
复制相似问题