Переменная типа данных строки привязки из курсора объявления - PullRequest
0 голосов
/ 14 октября 2019

Как я могу объявить переменную, используя тип данных (строку) привязки из объявленного курсора в 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». Я пытался использовать «строку привязки», но db2 предупредил меня.

1 Ответ

0 голосов
/ 15 октября 2019

Вы можете привязать тип к строке таблицы, между прочим. Существуют различные способы использования этих вещей в зависимости от ваших требований.

В вашем запросе есть объединение, поэтому вы можете объявить тип, соответствующий каждой строке из курсора, и затем вы можете объявить строго типизированный тип курсора дляваш тип строкиПозже вы можете назначить запрос переменной этого типа курсора.

Вы можете передавать курсоры в качестве параметров хранимым процедурам, и вы можете иметь процедуру, возвращающую тип курсора, и вы можете объявлять переменные каждого изтипы, которые вы создаете.

Вы не показываете, хотите ли вы, чтобы набор результатов процедуры был типом курсора, или вы хотите обработать набор результатов внутри хранимой процедуры в набранном видепеременные.

Изучите Db2 Knowledge Center для своей версии Db2-LUW, чтобы узнать о строго типизированных курсорах и о том, как их использовать в SQL PL. модуля, но вы можете использовать те же приемы в хранимых процедурах) в этом файле "modules.db2", который также появляется в каталоге SAMPLES на вашем сервере DB2-LUW, если вы установили компонент примеров во время установки. * Вы можете увидеть пример онлайн на пример 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@
...