我需要在0(或)1之类的过程中获取最后一个被调用过程的状态,以便我可以验证过程是否成功执行。
调用单个过程将调用多个过程,如何验证被调用过程的状态?
在AS400 DB2
中,我使用如下:
call procedure_1();
GET DIAGNOSTICS V_RETVAL = RETURN_STATUS;
如果程序执行成功,则返回0,否则返回1.
与Teradata
一样,我该如何实现?
答案 0 :(得分:0)
create table table_err
(
errno number,
date_added date default Current_Timestamp(0)
);
replace procedure proc_test3()
begin
declare l_user number;
select 2/0 into l_user;
end;
replace procedure proc_test4()
begin
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR divide_by_zero
BEGIN
insert into table_err (errno) select 1;
-- print 'ERROR: division by zero'
END;
call proc_test3();
end;
call proc_test4();
select * from table_err;
答案 1 :(得分:0)
在内部过程中,你应该有一个out参数,当程序成功完成时应该返回成功,如果失败它应该返回FAILED。
通过使用存在的处理程序,您可以定义退出状态: -
您应该在内部程序中使用以下块: -
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET lv_sql_state = SQLSTATE;
SET ln_sql_code = SQLCODE;
SET lv_out_status ='FAILED';
ROLLBACK;
END; -- this is a good practice to always use this block in every procedure
因此,在任何时候你的程序失败都会导致失败。
现在如果程序如下
REPLACE PROCEDURE database_name.proc_name1 ( OUT lv_out_status VARCHAR(10))
BEGIN
DECLARE lv_status VARCHAR(10000) DEFAULT '';
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET lv_sql_state = SQLSTATE;
SET ln_sql_code = SQLCODE;
SET lv_out_status ='FAILED';
ROLLBACK;
END;
CALL database.proc_name1(lv_status); -- variable status will capture the status of the procedure
IF lv_status = 'FAILED'
THEN
SET lv_message = 'Failure in calling of procedure proc_name1 ';
ELSE
write other queries;
END IF;
END;