Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提取SQLException中的参数_Java_Oracle_Stored Procedures_Plsql_Oracle10g - Fatal编程技术网

Java 提取SQLException中的参数

Java 提取SQLException中的参数,java,oracle,stored-procedures,plsql,oracle10g,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);

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

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

            END IF;
returnval是我的过程中的IN-OUT参数

在java中,通常通过以下方式获取OUT参数:

callablestatement.getInt(2);

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

returnval:=sdate
在您的情况下是死代码,因为在将值赋给
returnval
之前会引发异常。但如果您想终止程序执行,则无法从proc调用中获取任何
returnval

您可以通过在
过程中创建一个块来实现这一点

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
在您的情况下是死代码,因为在将值赋给
returnval
之前会引发异常。但如果您想终止程序执行,则无法从proc调用中获取任何
returnval

您可以通过在
过程中创建一个块来实现这一点

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;

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


无法获得响应。

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


您无法获得响应。

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

  • 您打算捕获异常并在调用代码中适当地处理它
  • 出现问题,您希望应用程序崩溃并烧坏 你没有做这两件事,也不需要做。您只需要停止代码运行并“返回”(这是一个过程)您的值。在这种情况下,我建议使用

    return
    结束包含它的匿名块的执行,并在过程中向调用语句返回“control”。i、 它非常合身

    以下代码在停止执行过程之前,使用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\u not\u 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\u one
    )中,您将返回
    sdate
    ,而在第二个过程中,您将返回一个null,假设之前未分配
    returnval

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

  • 您打算捕获异常并在调用代码中适当地处理它
  • 出现问题,您希望应用程序崩溃并烧坏 你没有做这两件事,也不需要做。您只需要停止代码运行并“返回”(这是一个过程)您的值。在这种情况下,我建议使用

    return
    结束包含它的匿名块的执行,并在过程中向调用语句返回“control”。i、 它非常合身

    以下代码在停止执行过程之前,使用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\u not\u 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\u one
    )中,您将返回
    sdate
    ,在第二个过程中返回null,假设以前没有分配
    returnval

    在任何情况下都不是一个不可访问的语句吗?@beerbajay我在编译和运行过程时没有收到任何这样的错误。
    returnval:=sdate
    在任何情况下都不是一个不可访问的语句吗?@beerbajay我在编译和运行过程时没有收到任何这样的错误编译并运行过程。如果它像
    returnval:=sdate;引发应用程序错误(-20145,“错误”)因为我想将错误代码返回到我的应用程序。@Polappan:如果出现
    raise\u application\u错误
    ,则无法从进程返回returnval,您能告诉我为什么在发生异常时需要该值吗?我想在应用程序中显示异常发生的日期,这就是为什么我想从过程中返回值。@Polappan:好的,也许我理解您的问题是错误的,您可以在
    引发应用程序错误
    消息中传递
    日期
    ,通过这种方式,您可以显示引发异常的日期的消息。我已经编辑了我的帖子。是的,我是这样想的。非常感谢。如果它像
    returnval:=sdate;引发应用程序错误(-20145,“错误”)因为我想将错误代码返回到我的应用程序。@Polappan:如果出现
    raise\u application\u错误
    ,则无法从进程返回returnval,您能告诉我为什么在发生异常时需要该值吗?我想在应用程序中显示异常发生的日期,这就是为什么我想从过程中返回值。@Polappan:好的,也许我理解您的问题是错误的,您可以在
    引发应用程序错误
    消息中传递
    日期
    ,通过这种方式,您可以显示引发异常的日期的消息。我已经编辑了我的帖子。是的,我是这样想的。谢谢