2012-06-07 51 views
0

在我的存储过程,我有以下声明取OUT参数的SQLException中

IF (sdate > sysdate) 
      THEN 
       RAISE exec_not_allowed; 
           returnval := sdate; 

      END IF; 

returnval是IN OUT参数在我的程序。

在java中通常OUT参数是通过使用获取:

callablestatement.getInt(2); 

我怎样才能收到returnval在Java中,如果抛出一个例外? Java SQLException部分捕获异常错误代码。

+0

是不是'returnval:= sdate'在任何情况下都无法访问? – beerbajay

+0

@beerbajay我在编译和运行过程时没有遇到任何此类错误。 – user75ponic

回答

2

为什么你会在这种情况下引发异常?你应该只在两种情况下真的发生异常:

  1. 你打算捕获异常并在调用代码中正确处理它。
  2. 有些东西是错的,你想让你的应用程序崩溃和烧伤。

你不是在做这些事情,也不需要。你只是想停止代码运行和“返回”(这是一个过程)你的价值。在这种情况下,我会建议使用return

return结束包含它的匿名块的执行,并在过程中将“控制”返回给调用语句。即它完美地符合法案。

在停止执行过程之前,使用return,以下代码将sdate指定给out参数。 “更多的东西”永远不会发生。

create or replace procedure my_procedure_one (returnval in out date) is 
begin 

    -- some stuff. 
    if sdate > sysdate then 
     returnval := sdate; 
     -- we don-t want to continue any more if this is true. 
     return; 
    end if; 
    -- more stuff. 
end; 

如果你只是想分配给sdate如果returnval的条件是真,那么你只需换轮这两条线;也许可以将它从if语句中删除,以使其更加明显。这就是你的代码目前所做的,因为当你提升exec_not_allowed时,所有执行都停止了。

create or replace procedure my_procedure_two (returnval in out date) is 
begin 

    -- some stuff. 

    -- we don-t want to continue any more if this is true. 
    if sdate > sysdate then 
     return; 
    end if; 

    returnval := sdate; 
    -- more stuff. 
end; 

无论哪种情况,您的Java调用都保持不变。在第一个程序(my_procedure_one)中,您将获得sdate个返回,并在第二个过程中返回null,假定returnval以前未被分配。

+0

所以你的意思是说如果返回,那么更多的东西永远不会发生?代码执行将不会继续进行? – user75ponic

+2

@Polappan,在这个过程中的执行不会进一步发生,与引发的异常相同。但是,您不会引发异常,调用过程将从调用此过程的角度继续运行。 – Ben

+0

好吧,我之所以问这一点是因为我的更多内容是插入和更新语句。所以如果条件成立,我想停止这个程序。 – user75ponic

1

returnval:=sdate;是在你的情况下,死代码,因为异常的目的是returnval。但分配值之前,如果你要终止程序的执行,然后抬起,你没能获得来自呼叫PROC任何returnval

您可以在procedure内创建一个块来完成。

CREATE OR REPLACE PROCEDURE temp(returnval IN OUT date) 
IS 
BEGIN 
: 
: 
BEGIN 
    IF (sdate > sysdate) THEN 
     RAISE exec_not_allowed; 
    END IF; 

EXCEPTION 
    WHEN exec_not_allowed THEN 
    returnval := sdate; --after raising an exception you can assign it like this . 

    raise_application_error 
     (-20145          --sqlcode 
     ,'Exception is raised for date'||returnval --message 
    ); 
END; 
EXCEPTION 
WHEN OTHERS THEN 
    -- 
END temp; 
+0

如果它像'returnval:= sdate; raise_application_error(-20145,'Error');'因为我想将错误代码返回给我的应用程序。 – user75ponic

+0

@Polappan:在'raise_application_error'的情况下,它不可能从你的proc返回returnval,你能告诉我为什么你想要异常值。 –

+0

我想在应用程序或日期中显示异常提出,这就是为什么我想从过程返回值。 – user75ponic

0

当发生异常时,程序执行终止。

您无法获得答复。