Db2 声明游标中的锚行数据类型变量

Db2 声明游标中的锚行数据类型变量,db2,cursor,anchor,procedure,Db2,Cursor,Anchor,Procedure,如何使用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_S

如何使用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\u c\u id\u dist\u errados'。我尝试使用的锚行,但db2提醒了我。

您可以使用表的锚行,以及其他内容。根据您的需求,有不同的方法来使用这些东西

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

可以将游标作为参数传递给存储过程,也可以让过程返回游标类型,还可以声明所创建的每种类型的变量

您不显示是希望过程的结果集是游标类型,还是希望在类型化变量中的存储过程内部处理结果集

学习DB2LUW版本的Db2知识中心,了解强类型游标以及如何在SQLPL中使用它们

有一个在线示例显示为一个模块,但是您可以在文件modules.db2中的存储过程中使用相同的技术,如果您在安装时安装了SAMPLES组件,该文件也会显示在db2-LUW服务器的SAMPLES目录下

你可以在网上看到这个例子

对于与代码中的光标匹配的行类型,建议使用用户定义的类型:

--#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@