来自声明游标的锚行数据类型变量

Anchor row data type variable from declare cursor

如何使用 db2 中已声明游标的锚点数据类型(行)来声明变量?

create or replace PROCEDURE     "SP_ATUALIZA_ID_DISTRIBUIDOR_FT"
    BEGIN

        DECLARE C_ID_DIST_ERRADOS CURSOR FOR
                SELECT DISTINCT 
                    F.ID_MES,
                    F.ID_DISTRIBUIDOR_SO,
                    D.CNPJ_DISTRIBUIDOR_SO,
                    F.ID_COMPANIA
                FROM    
                    DMTLDBR.TB_FATO_VENDAS_SELLOUT F,
                    DMTLDBR.TB_DIM_ECDISTRIBUIDOR_SO D
                WHERE ID_MES <= 201309 AND                                
                  F.ID_DISTRIBUIDOR_SO = D.ID_DISTRIBUIDOR_SO AND
                  F.ID_COMPANIA <> D.ID_COMPANIA
                ORDER BY ID_MES;
         BEGIN
         DECLARE REG_C_ID_DIST_ERRADOS ANCHOR ROW OF C_ID_DIST_ERRADOS;

         OPEN C_ID_DIST_ERADOS
         ...
         END;

    END;

我有一个声明内部游标的过程,它将用于获取结果并插入变量 'reg_c_id_dist_errados'。我已尝试使用 "anchor row of",但 db2 已提醒我。

您可以 anchor a type to a row of a table 等等。根据您的要求,有不同的方式使用这些东西。

您的查询有一个连接,因此您可以声明一个类型来匹配游标中的每一行,然后您可以为您的行类型声明强类型游标类型。稍后您可以将查询分配给该游标类型的变量。

您可以将游标作为参数传递给存储过程,您可以让一个过程return一个游标类型,并且您可以声明您创建的每种类型的变量。

您没有显示是否希望过程的结果集是游标类型,或者是否希望在类型化变量中处理存储过程中的结果集。

研究适用于您的 Db2-LUW 版本的 Db2 知识中心,了解强类型游标以及如何在 SQL PL 中使用它们。

此文件 "modules.db2" 中有一个在线示例(显示为模块,但您可以在存储过程中使用相同的技术)如果您在安装时安装了示例组件。

您可以在线查看示例,网址为 the example modules.sql

以下是对与代码中的光标匹配的行类型使用用户定义类型的一个建议:

--#SET TERMINATOR @


-- this type represents a row that might be returned in the cursor. 
-- Choose your own name for the type.
-- Choose the correct data-types for your tables.

create or replace type DE_ROW_T as row
(
id_mes bigint,
ID_DISTRIBUIDOR_SO bigint,
CNPJ_DISTRIBUIDOR_SO bigint,
ID_COMPANIA bigint
)@



create or replace type C_ID_DIST_ERRADOS_CURSOR_T as DE_ROW_T CURSOR@

create or replace PROCEDURE     "SP_ATUALIZA_ID_DISTRIBUIDOR_FT"
language sql
specific SP_ATUALIZA_ID_DISTRIBUIDOR_FT
    BEGIN

        DECLARE V_ROW DE_ROW_T;
        DECLARE C_ID_DIST_ERRADOS  C_ID_DIST_ERRADOS_CURSOR_T;


        SET C_ID_DIST_ERRADOS = CURSOR FOR 
                SELECT DISTINCT 
                    F.ID_MES,
                    F.ID_DISTRIBUIDOR_SO,
                    D.CNPJ_DISTRIBUIDOR_SO,
                    F.ID_COMPANIA
                FROM    
                    DMTLDBR.TB_FATO_VENDAS_SELLOUT F,
                    DMTLDBR.TB_DIM_ECDISTRIBUIDOR_SO D
                WHERE ID_MES <= 201309 AND                                
                  F.ID_DISTRIBUIDOR_SO = D.ID_DISTRIBUIDOR_SO AND
                  F.ID_COMPANIA <> D.ID_COMPANIA
                ORDER BY ID_MES;

         OPEN C_ID_DIST_ERRADOS;
         FETCH C_ID_DIST_ERRADOS INTO v_row;

    END@