我看到了另一个关于将SET数据类型推送到c#代码的问题,但它并没有真正回答我想要做的事情。
我正在尝试使用select将LIST数据类型传递给SPL。我知道在SPL中,LIST可以定义并设置为:
DEFINE a LIST(INTEGER NOT NULL);
LET a = LIST{(SELECT unique b from numberTable)};
我也知道,如果列表的变量是LIST,则可以将列表发送到SPL。
execute procedure someProc(LIST{1,2,3});
知道这两件事我想尝试从SELECT为变量创建一个LIST。
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)});
我也试过像这样输入选择
execute procedure retInt((SELECT a from tab1)::LIST(INTEGER NOT NULL));
不用说创建了语法错误。
我可能会尝试做一些不可能的事情。查看IBM的文档我没有找到任何内容,但有时我觉得他们的文档很难使用。
有什么想法吗?
提前谢谢你, 卡顿
答案 0 :(得分:0)
在Informix中,除非select返回1行,否则无法直接从SELECT语句构建LIST。 我怀疑在您提供查询的示例中正好返回1行并且创建了LIST。
Informix不允许您从返回多行的SELECT创建LIST,但它接受从返回多行的SELECT创建MULTISET,然后可以将其转换为LIST。
EXECUTE PROCEDURE retInt((MULTISET(SELECT ITEM a FROM tab1)::LIST(INTEGER NOT NULL)));
关键字ITEM需要创建MULTISET的INTEGER值,而不是多个ROW值。