Stored procedures 如何在teradata中的过程内返回被调用过程的状态?

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

我需要获取过程中最后调用的过程的状态,如0(或)1,以便验证该过程是否成功执行

调用单个过程将调用多个过程,如何验证被调用过程的状态

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,并相应地进行设置。