2012-06-07 92 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

當發生異常時,程序執行終止。

您無法獲得答覆。