Java 使用JDBC编写带有绑定变量的匿名PL/SQL块
我有一个带绑定变量的匿名PL/SQL块,我想通过JDBC运行它 PL/SQL块示例:Java 使用JDBC编写带有绑定变量的匿名PL/SQL块,java,oracle,jdbc,plsql,Java,Oracle,Jdbc,Plsql,我有一个带绑定变量的匿名PL/SQL块,我想通过JDBC运行它 PL/SQL块示例: variable v_value number declare v_return varchar2(30); begin :v_value:=300; select ename into v_return from emp where empno=:v_value; end; 相应的Java代码将使用带有“?”的转义语法来设置变量。所以这个块看起来像这样(如果我错了,请纠正我): 现在,假设我的变量是一个输入
variable v_value number
declare
v_return varchar2(30);
begin
:v_value:=300;
select ename into v_return from emp where empno=:v_value;
end;
相应的Java代码将使用带有“?”的转义语法来设置变量。所以这个块看起来像这样(如果我错了,请纠正我):
现在,假设我的变量是一个输入参数,我必须如下设置参数:
// omitting the CallableStatement and conn declarations
cs = conn.prepareCall(block);
cs.setInt(parameterIndex, parameterValue);
CallableStatement call = conn.prepareCall(
"{CALL doubleMyInt(?)}");
// for inout parameters, it is good practice to
// register the outparameter before setting the input value
call.registerOutParameter(1, Types.INTEGER);
call.setInt(1,10);
问题是在我的块中有两个“?”用于替换绑定参数:v_值。这意味着当使用转义语法时,只会设置1'st“?”。第二个“?”将被保留为“挂起”
在这种情况下,当同一个绑定变量在PL/SQL块中被多次使用时,我应该如何用JDBC转义语法进行翻译?
编辑:
variable v_value number
declare
v_return varchar2(30);
begin
:v_value:=300;
select ename into v_return from emp where empno=:v_value;
end;
我发现这与我的问题有关。我从中了解到的是,我必须重写所有匿名PL/SQL块,这些块在同一块中使用多个绑定变量实例。有什么解决办法吗?或者就是这个。。。游戏结束了。。。这就是JDBC的工作方式,我必须按时完成
期待答案。。。为此搜索了2小时,但没有结果。请尝试以下查询:
String block = "declare " +
" v_return varchar2(30);" +
"begin" +
" select ename into v_return from emp where empno = ?;" +
" ? := v_return; " +
"end;";
CallableStatement cs = connection.prepareCall( block );
cs.setInt( 1, v_value );
cs.registerOutParameter( 2, java.SQL.VARCHAR );
cs.executeUpdate();
String result = cs.getString( 2 );
有关更多详细信息和示例,请参见以下链接:尝试此查询:
String block = "declare " +
" v_return varchar2(30);" +
"begin" +
" select ename into v_return from emp where empno = ?;" +
" ? := v_return; " +
"end;";
CallableStatement cs = connection.prepareCall( block );
cs.setInt( 1, v_value );
cs.registerOutParameter( 2, java.SQL.VARCHAR );
cs.executeUpdate();
String result = cs.getString( 2 );
有关详细信息和示例,请参阅以下链接:看看这个 基本上,您可以将同一变量绑定为输入和输出,如下所示:
// omitting the CallableStatement and conn declarations
cs = conn.prepareCall(block);
cs.setInt(parameterIndex, parameterValue);
CallableStatement call = conn.prepareCall(
"{CALL doubleMyInt(?)}");
// for inout parameters, it is good practice to
// register the outparameter before setting the input value
call.registerOutParameter(1, Types.INTEGER);
call.setInt(1,10);
我希望有帮助。看看这个
基本上,您可以将同一变量绑定为输入和输出,如下所示:
// omitting the CallableStatement and conn declarations
cs = conn.prepareCall(block);
cs.setInt(parameterIndex, parameterValue);
CallableStatement call = conn.prepareCall(
"{CALL doubleMyInt(?)}");
// for inout parameters, it is good practice to
// register the outparameter before setting the input value
call.registerOutParameter(1, Types.INTEGER);
call.setInt(1,10);
我希望这会有所帮助。我已经阅读了Oracle文档,但它们对我的情况没有帮助。您的示例是两个绑定变量(IN和OUT)。我给出的示例使用了一个PL/SQL块,其中一个IN-bind变量使用了两次。只有在OUT或INOUT的情况下,我们才需要注册参数。请解释一下,可能我遗漏了什么-为什么要运行SELECT查询,但不想检索is NOT结果?这对我来说没有意义-如果我不想得到查询的结果,我只是。。。根本不要运行它。这只是一个例子。。。我是否检索结果并不重要。要点是:如果PL/SQL块中有同一个bind变量的多个实例,如何使用JDBC占位符?您注册参数的解决方案对这个问题没有帮助。我已经阅读了Oracle文档,但它们对我的情况没有帮助。您的示例是两个绑定变量(IN和OUT)。我给出的示例使用了一个PL/SQL块,其中一个IN-bind变量使用了两次。只有在OUT或INOUT的情况下,我们才需要注册参数。请解释一下,可能我遗漏了什么-为什么要运行SELECT查询,但不想检索is NOT结果?这对我来说没有意义-如果我不想得到查询的结果,我只是。。。根本不要运行它。这只是一个例子。。。我是否检索结果并不重要。要点是:如果PL/SQL块中有同一个bind变量的多个实例,如何使用JDBC占位符?您注册参数的解决方案对这个问题没有帮助。您是否也转到了谷歌搜索结果的第二页?我不相信你真的绝望了,除非你去那里!你也去谷歌搜索结果的第二页了吗?我不相信你真的绝望了,除非你去那里!谢谢你的努力,我不知道你能做到,所以+1。。。但这对我的案子没有帮助。请重新阅读我的问题(用粗体表示)。其想法是,在某些情况下,您需要运行仅在参数中声明的PL/SQL块,然后执行一些其他操作,然后再检索结果(有时根本不需要检索它们)。听起来很奇怪,我知道,但从DBA的角度来看不是(顺便说一句,我不是DBA)。我现在看到了你的问题,是的。。。我不知道如何让jdbc知道如何改变绑定变量。像这样编写可调用语句通常是个坏主意,因此重写plsql代码是最好的选择。或者,效率较低的方法是创建多个db调用:一个是找出bind变量将获得的值(在您的示例中为300),另一个是将它绑定到where clauseYeap,这正是我最终(实际上是DBA)所做的。感谢您的努力,我不知道您可以这样做,所以为此+1。。。但这对我的案子没有帮助。请重新阅读我的问题(用粗体表示)。其想法是,在某些情况下,您需要运行仅在参数中声明的PL/SQL块,然后执行一些其他操作,然后再检索结果(有时根本不需要检索它们)。听起来很奇怪,我知道,但从DBA的角度来看不是(顺便说一句,我不是DBA)。我现在看到了你的问题,是的。。。我不知道如何让jdbc知道如何改变绑定变量。像这样编写可调用语句通常是个坏主意,因此重写plsql代码是最好的选择。或者,效率较低的方法是创建多个db调用:一个是找出bind变量将获得的值(在您的示例中为300),另一个是将其绑定到where CLAUSEEAP,这正是我最终(实际上,是DBA)所做的。