Возвращение журнала действий внутри хранимой процедуры в Teradata - PullRequest
0 голосов
/ 23 января 2019

Требуется получить журнал всех операторов DML, выполненных внутри хранимой процедуры в teradata. Эта хранимая процедура вызывается внутри сценария оболочки с использованием BTEQ. Задача состоит в том, чтобы записать журнал всех действий, выполняемых внутри оболочки, в файл журнала в Unix. Если возникает какая-либо ошибка, ее также необходимо зафиксировать.

Хранимая процедура содержит 20 слияний SQL, и я хочу увидеть, сколько строк было затронуто и сколько времени занял каждый оператор. Я попытался вызвать отдельные слияния через BTEQ (вместо вызова в хранимой процедуре), но есть значительный выигрыш во времени, если он вызывается внутри SP. Сейчас я вижу только то, что хранимая процедура была успешно завершена.

replace procedure SP_Test() 
BEGIN
MERGE INTO T1 using T2  on T1.C1 = T2.C1
WHEN NOT MATCHED THEN INSERT (C1,C2,C3) VALUES (T2.C1,T2.C2,T3.C3)
 WHEN MATCHED 
THEN UPDATE                                                                                              
SET                                                                                             
C1                           =             CASE statement 1                                                                                           
C2                           =             CASE statement 2                                 
c3                            =             CASE statement 3 ;
END;

внутри блока BTEQ сценария оболочки test.sh,

bteq << EOF >>LOgFILE.txt 2>&1
.LOGON source/user,password;
.COMPILE FILE = sp_merge.txt;
.IF ERRORCODE  <> 0 THEN .GOTO QUITNOTOK
call SP_Test();
.IF ERRORCODE  <> 0 THEN .GOTO QUITNOTOK
.LABEL QUITOK
.LOGOFF
.QUIT 0
.LABEL QUITNOTOK
.QUIT 2
EOF

Файл журнала в данный момент **** Процедура выполнена. **** Всего прошло 2 минуты 47 секунд.

Ожидаемый результат **** Слияние завершено. Пострадали 5641191 строк. 5641191 строк вставлено, строки не обновлены, строки не удалены. **** Всего прошло 2 минуты 45 секунд.

1 Ответ

0 голосов
/ 23 января 2019

Вы можете сделать одну вещь.

Напишите еще одну процедуру и сохраните оператор вставки, как показано ниже:

REPLACE PROCEDURE <DB_USER>. log_process_run_message   ( IN in_n_process_run_id  DECIMAL(18,0)   , 
                                                    IN in_v_process_name    VARCHAR(30)     ,
                                                    IN in_v_message_txt     VARCHAR(50000)  ,
                                                    IN in_d_message_ts      TIMESTAMP(6)
                                                   )
BEGIN

    BT; -- Begin Transaction 
        INSERT INTO <SCHEMA_NAME>.cop_process_run_message_op
                    (
                     process_name           ,
                     message_txt            ,
                     message_ts
                    ) 
        VALUES      (
                     in_v_process_name      ,
                     in_v_message_txt       ,
                     in_d_message_ts
                    );
    ET; -- End Transaction
END;

В вашей основной процедуре есть обработчик выхода;

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    SET lv_sql_state = SQLSTATE;
    SET ln_sql_code  = SQLCODE;
    SET out_status   = 'FAILED';
    ROLLBACK;

    SET  lv_my_mesg = 'Error in : ' || lv_my_mesg || ' - SQLSTATE: ' || lv_sql_state || ', SQLCODE: ' || CAST(ln_sql_code AS CHAR);
    CALL <DB_USER>.log_process_run_message (ln_run_id,lv_err_component,lv_my_mesg,CURRENT_TIMESTAMP(6));
END;

Также определите нижеприведенную переменную в вашей основной процедуре

SET lv_err_component='ur proc name'

Теперь вызывайте эту процедуру внутри вашей основной процедуры после каждого оператора слияния:

SET lv_my_mesg ='Merge 1 completed '||CAST(CURRENT_TIMESTAMP(0) AS CHAR(19));
CALL <DB_USER>.log_process_run_message (lv_err_component,lv_my_mesg,CURRENT_TIMESTAMP(6));

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

...