Stored procedures DB2存储过程:声明内部“行集”

Stored procedures DB2存储过程:声明内部“行集”,stored-procedures,db2,db2-luw,Stored Procedures,Db2,Db2 Luw,我正在将一些过程从PostgreSQL迁移到一个新的DB2环境。我已经完成了大部分工作,但找不到为内部行集/记录声明变量的方法 基本上,程序对Postgres的作用是: DECLARE counts RECORD; BEGIN -- fill "counts" with one row of aggregated data SELECT COUNT(....) AS failed_inserts, COUNT(....) AS failed_update

我正在将一些过程从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的回答指出了正确的解决方案:

在过程之外,创建所需的行类型: 创建类型empRow作为行失败\u插入整数,失败\u更新整数,失败\u删除整数

然后可以在过程中声明新类型
宣布newRow empRow

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

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.未经测试


更多信息

除了创建或多或少特定于单个查询的永久**用户定义类型之外,您还可以使用以下方法实现相同的目的:


**永久性表示系统目录中定义的内容。

谢谢您的指针。DB2不接受您的代码“一个意外的标记[…]”,但在您指出的手册章节的帮助下,我成功地完成了代码。我将编辑我的帖子。确保您的代码中没有混合PL/SQL和DB2SQLPL语法,如果您选择PL/SQL,请启用Oracle兼容性。
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;