在存储过程中我可以进入退出状态?

时间:2016-12-08 16:34:02

标签: oracle

我有oracle存储过程,我在程序开始时检查发件人I&#d,源系统和事务编号。我可以这样做:

 If Id != "aaa"    
      Exit -1;    
 Else if source = " ".   
      Exit -1;    
 Else if trans = " ".   
      Exit -1;    
 Else.   
     -- continues stored procedure   

我感谢任何帮助

2 个答案:

答案 0 :(得分:2)

为了更一般地重新解释你的问题,你希望你的例程的调用者知道它内部是否发生了不好的事情。在PL / SQL中有(至少)三种方法。

使用OUT参数

过程不能返回一个值,就像函数一样,但它可以设置一个输出参数:

CREATE PROCEDURE inner (p_id IN VARCHAR2(10), p_res OUT NUMBER)
IS
BEGIN
  p_res := 0; -- default value
  IF p_id = 'aaa' THEN
    p_res := -1;
    RETURN;
  ELSE
    -- do something 
  END IF;
END;

然后在调用者中你会得到:

DECLARE res NUMBER;
...
inner('aaa', res);
IF res = -1 THEN
  -- panic!
END IF;
...

使用功能

尽管您似乎厌恶功能,但这可能是一种选择。

CREATE FUNCTION inner (p_id IN VARCHAR2(10))
  RETURN NUMBER
IS
BEGIN
  IF p_id = 'aaa' THEN
    RETURN -1;
  END IF;
  -- do something 
  RETURN 0;
END;

然后在来电者中:

...
IF inner('aaa') = -1 THEN
  -- panic!
END IF;
...

使用例外

与其他编程语言类似,PL / SQL也有例外:

CREATE PROCEDURE inner (p_id IN VARCHAR2(10))
IS
BEGIN
  IF p_id = 'aaa' THEN
    RAISE_APPLICATION_ERROR(-20000, 'ID cannot be ''aaa''');
  ELSE
    -- do something 
  END IF;
END;

并且在来电者中:

...
DECLARE
  panic  EXCEPTION;                       -- declare exception
  PRAGMA EXCEPTION_INIT (panic, -20000);  -- assign error code to exception
...
BEGIN
  inner ('aaa');
EXCEPTION
  WHEN panic THEN
    -- proceed to panic
END;

答案 1 :(得分:0)

您对IF...ELSEexit使用了错误的语法。

鉴于您说您需要获得返回值,您可能需要使用CASE这样的函数:

create or replace function testFun ( pIn1 varchar2, pIn2 varchar2) return varchar2 is
begin
    case 
      when pIn1 is null then
        return -1;
      when pIn2 = ' ' then
       return -2; 
      else
        return 999;
    end case;
end;