【问题标题】:Informix 11.70.FC8GE - How to pass a LIST data type to a SPL using a SELECTInformix 11.70.FC8GE - 如何使用 SELECT 将 LIST 数据类型传递给 SPL
【发布时间】:2015-12-18 20:21:56
【问题描述】:

我看到另一个关于将 SET 数据类型推送到 c# 代码的问题,但它并没有真正回答我想要做什么。

我正在尝试使用选择将 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 的文档我没有找到任何东西,但有时我觉得他们的文档可能很难使用。

有什么想法吗?

提前谢谢你, 卡顿

【问题讨论】:

    标签: informix sqldatatypes spl


    【解决方案1】:

    在 Informix 中,您不能直接从 SELECT 语句构建 LIST,除非选择正好返回 1 行。 我怀疑在您提供查询的示例中恰好返回 1 行并创建了 LIST。

    Informix 不允许您从返回多行的 SELECT 创建 LIST,但它接受从返回多行的 SELECT 创建 MULTISET,然后可以将其强制转换为 LIST。

    EXECUTE PROCEDURE retInt((MULTISET(SELECT ITEM a FROM tab1)::LIST(INTEGER NOT NULL)));
    

    需要关键字 ITEM 来创建 INTEGER 值的 MULTISET,而不是 ROW 值的多重集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 2023-04-05
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2017-10-29
      • 2020-11-26
      • 1970-01-01
      相关资源
      最近更新 更多