Informix 11.70.FC8GE - 如何使用SELECT将LIST数据类型传递给SPL

时间:2015-12-18 20:21:56

标签: informix sqldatatypes spl

我看到了另一个关于将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的文档我没有找到任何内容,但有时我觉得他们的文档很难使用。

有什么想法吗?

提前谢谢你, 卡顿

1 个答案:

答案 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值。