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:好的,也许我理解您的问题是错误的,您可以在引发应用程序错误
消息中传递日期
,通过这种方式,您可以显示引发异常的日期的消息。我已经编辑了我的帖子。是的,我是这样想的。谢谢