Stored procedures 如何在teradata中的过程内返回被调用过程的状态?
我需要获取过程中最后调用的过程的状态,如0(或)1,以便验证该过程是否成功执行 调用单个过程将调用多个过程,如何验证被调用过程的状态 在Stored procedures 如何在teradata中的过程内返回被调用过程的状态?,stored-procedures,plsql,teradata,Stored Procedures,Plsql,Teradata,我需要获取过程中最后调用的过程的状态,如0(或)1,以便验证该过程是否成功执行 调用单个过程将调用多个过程,如何验证被调用过程的状态 在AS400 DB2中,我使用了以下方法: call procedure_1(); GET DIAGNOSTICS V_RETVAL = RETURN_STATUS; 如果过程执行成功,则返回0或1 与Teradata类似,如何实现?在内部过程中,应该有一个out参数,当过程成功完成时,该参数应返回success;如果失败,则应返回failed create t
AS400 DB2
中,我使用了以下方法:
call procedure_1();
GET DIAGNOSTICS V_RETVAL = RETURN_STATUS;
如果过程执行成功,则返回0或1
与Teradata类似,如何实现?在内部过程中,应该有一个out参数,当过程成功完成时,该参数应返回success;如果失败,则应返回failed
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;
通过使用exist处理程序,您可以定义退出状态:-
应在内部程序中使用以下程序块:-
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;
在内部过程中,您应该有一个out参数,当过程成功完成时,它应该返回success;如果失败,它应该返回failed 通过使用exist处理程序,您可以定义退出状态:- 应在内部程序中使用以下程序块:-
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;
当过程调用失败时,它没有成功运行<代码>获取诊断可在错误处理程序中使用。或者将变量传递给SP并进行相应设置。当过程调用失败时,它未成功运行<代码>获取诊断可在错误处理程序中使用。或者将变量传递给SP,并相应地进行设置。