0

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

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

            END IF;

returnval 在我的过程中是 IN OUT 参数。

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

callablestatement.getInt(2);

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

4

3 回答 3

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之前没有分配。

于 2012-06-07T16:55:03.167 回答
1

returnval:=sdate;在您的情况下是死代码,因为在分配值之前引发了异常returnval。但是如果您想终止程序执行,那么您将无法returnval从 proc 调用中获得任何信息。

您可以通过在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;
于 2012-06-07T12:34:17.387 回答
0

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

你无法得到回应。

于 2012-06-07T12:35:27.643 回答