要求是获取在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秒。
答案 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语句,如果有的话也会记录您的错误消息。让我知道是否有帮助。