在SQLException中获取OUT参数

时间:2012-06-07 12:02:41

标签: java oracle stored-procedures plsql oracle10g

在我的存储过程中,我有以下声明

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

            END IF;

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

在java中,通常使用以下命令获取OUT参数:

callablestatement.getInt(2);

如果引发异常,如何在Java中收到returnval? Java [{1}}部分中捕获了异常错误代码。

3 个答案:

答案 0 :(得分:2)

在这种情况下,你为什么要提出异常?你应该只在两种情况下引发异常:

  1. 您打算捕获异常并在调用代码中正确处理它。
  2. 出现问题,您希望应用程序崩溃并烧毁。
  3. 你没有做这些事情,也不需要。您只想停止代码运行并“返回”(这是一个程序)您的值。在这种情况下,我建议使用return

    return结束包含它的匿名块的执行,并在一个过程中,将“control”返回给调用语句。即它完全适合这项法案。

    以下代码在暂停执行过程之前使用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

答案 1 :(得分:1)

在您的情况下,

returnval:=sdate;是一个死代码,因为在将值赋给returnval之前会引发异常。但是如果您想终止程序执行,那么您将无法获得任何{来自proc调用的{1}}。

您可以在returnval内创建一个块来实现。

procedure

答案 2 :(得分:0)

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

你无法得到答复。