【问题标题】:DB2 Stored Procedure: Declare an internal "rowset"DB2 存储过程:声明一个内部“行集”
【发布时间】:2014-10-21 08:04:33
【问题描述】:

我正在将一些过程从 PostgreSQL 迁移到新的 DB2 环境。我已经完成了大部分工作,但我找不到为内部行集/记录声明变量的方法。

这个过程在 Postgres 上的作用基本上是这样的:

DECLARE
    counts RECORD;
BEGIN
    -- fill "counts" with one row of aggregated data
    SELECT 
    COUNT(....) AS failed_inserts,
    COUNT(....) AS failed_updates,
    COUNT(....) AS failed_deletes,
    INTO counts
    FROM (...)

    -- check "counts" with some conditionals
    IF counts.failed_inserts > 0
        (...)
    END IF; 
    (...)

    -- return info depending on the data
    RETURN (...);

END

我在 IBM 手册或在线其他地方找不到等同于声明“计数”的方法。我需要的行是静态的(3 列聚合数据)。因此,如果可能的话,声明该行硬编码就足够了。

是否可以在 DB2 的存储过程中声明记录/数据集/“虚拟表”?

我们使用的是 DB2 for Linux (V10.5) 而不是 DB2 for iSeries。

@mustaccio 的回答指向正确的解决方案

在程序之外创建所需的行类型:
CREATE TYPE empRow AS ROW (failed_inserts INTEGER, failed_updates INTEGER, failed_deletes INTEGER);

然后您可以在过程中声明新类型 DECLARE newRow empRow;

【问题讨论】:

    标签: stored-procedures db2 db2-luw


    【解决方案1】:

    不确定我是否完全理解您想要什么,但您可能正在寻找 ROW 数据类型?像这样的:

    DECLARE
        TYPE counts_row AS ROW (
          failed_inserts INT,
          failed_updates INT,
          failed_deletes INT
        );
        counts counts_row;
    BEGIN
        -- fill "counts" with one row of aggregated data
        SELECT 
        COUNT(....) AS failed_inserts,
        COUNT(....) AS failed_updates,
        COUNT(....) AS failed_deletes,
        INTO counts
        FROM (...);
        ...
    

    PS。未测试。

    更多信息in the manual

    【讨论】:

    • 感谢您的指点。 DB2 不接受您的代码('An unexpected token "" [...]'),但在您指出的手册章节的帮助下,我设法完成了代码。我会编辑我的帖子。
    • 确保不要在代码中混合使用 PL/SQL 和 DB2 SQL PL 语法,如果选择 PL/SQL,请启用 Oracle 兼容性。
    【解决方案2】:

    您也可以使用FOR statement 来代替创建或多或少特定于单个查询的永久**用户定义类型:

    FOR counts AS c1 CURSOR FOR SELECT COUNT(.....) AS failed_inserts,
                                       COUNT(....)  AS failed_updates,
                                       COUNT(....)  AS failed_deletes,
                                  FROM (...)
    DO
        IF counts.failed_inserts > 0 THEN
            (....)
        END IF;
    END FOR;
    

    ** 永久意味着在系统目录中定义的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-20
      • 2018-08-28
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多