【问题标题】:Fetch OUT parameter in SQLException在 SQLException 中获取 OUT 参数
【发布时间】:2012-06-07 12:02:41
【问题描述】:

在我的存储过程中,我有以下语句

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

            END IF;

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

在 java 中通常使用以下方法获取 OUT 参数:

callablestatement.getInt(2);

如果引发异常,我如何在 Java 中接收 returnval?异常错误代码在JavaSQLException部分中被捕获。

【问题讨论】:

  • returnval := sdate 在任何情况下都不是无法访问的语句吗?
  • @beerbajay 我在编译和运行程序时没有收到任何此类错误。

标签: java oracle stored-procedures plsql oracle10g


【解决方案1】:

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

  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

【讨论】:

  • 所以你的意思是说如果return,那么更多的东西永远不会发生?代码执行将不会继续进行?
  • @Polappan,此过程中的执行将不会继续进行,与引发的异常相同。但是,您不会引发异常,并且调用过程将从调用该过程的点继续运行。
  • 好吧,我问这个的原因是我更多的东西是插入和更新语句。因此,如果条件为真,我想停止该过程。
  • @Polappan,出于所有意图和目的,我相信这就是您所需要的。您似乎不想引发错误,只是在某个点停止执行代码。谢谢 Gaurav :-)。
  • 是的,你是对的。我会尝试测试一下。非常感谢您的解决方案和解释。
【解决方案2】:

returnval:=sdate; 在您的情况下是死代码,因为在将值分配给 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;

【讨论】:

  • 如果它像returnval := sdate; raise_application_error (-20145, 'Error');,因为我想将错误代码返回给我的应用程序。
  • @Polappan:在raise_application_error的情况下不可能从你的proc返回returnval,你能告诉我为什么你想要这个值以防出现异常吗?
  • 我想在应用程序中显示或显示引发异常的日期,这就是为什么我想从过程中返回值。
  • @Polappan:好吧,可能我理解你的问题有误,你可以在raise_application_error消息中传递date,这样你就可以显示异常发生日期的消息提出..我已经编辑了我的帖子
  • 是的,我在想这样的事情。非常感谢。
【解决方案3】:

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

您无法得到回应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2012-07-26
    • 2014-08-13
    相关资源
    最近更新 更多