如何在teradata中返回程序内部调用程序的状态?

时间:2016-08-18 12:46:54

标签: stored-procedures plsql teradata

我需要在0(或)1之类的过程中获取最后一个被调用过程的状态,以便我可以验证过程是否成功执行。

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

AS400 DB2中,我使用如下:

call procedure_1();
GET DIAGNOSTICS V_RETVAL = RETURN_STATUS;

如果程序执行成功,则返回0,否则返回1.

Teradata一样,我该如何实现?

2 个答案:

答案 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;