返回Teradata中存储过程内活动的日志

时间:2019-01-23 09:00:15

标签: stored-procedures teradata

要求是获取在Teradata中的存储过程内执行的所有DML语句的日志。正在使用BTEQ在Shell脚本中调用此存储过程。问题是将外壳程序内部执行的所有活动的日志捕获到unix中的日志文件中。如果发生任何错误,也需要捕获。

存储过程包含20个合并SQL,我想查看受影响的行数以及每个语句花费的时间。我尝试通过BTEQ调用单个合并(而不是在存储过程中调用它),但是如果在SP中调用它,则会节省大量时间。现在,我所看到的只是存储过程已成功完成。

name == A

在test.sh shell脚本的BTEQ块中,

   name time measurement
1     A    3          24
2     A    5          48
3     A    6          28
4     A    7          24
5     A    8          21
6     B    5          29
7     B    7          53
8     B    8          39
9     C    2          34
10    C    3          67
11    C    4          94
12    C    5         405
13    C    6         830
14    C    7        1550
15    C    8        2020
16    D    1          25
17    D    2          60
18    D    3         200
19    D    4         300
20    D    5        1100
21    D    6        2200
22    D    7        3000
23    D    8        3500

当前日志文件 ****程序已执行。 ****总耗时为2分47秒。

预期产量 ****合并完成。 5641191行受到影响。      插入5641191行,未更新任何行,未删除任何行。 ****总耗时为2分45秒。

1 个答案:

答案 0 :(得分:0)

你可以做一件事。

编写另一个过程,并保留如下所示的插入语句:

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'

现在,在每个merge语句之后,在主过程中调用此过程:

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));

这是要执行的操作,它将在成功执行您的merge语句后插入一条记录,并且如果出现错误,它将 在退出处理程序中执行call语句,如果有的话也会记录您的错误消息。让我知道是否有帮助。