我有一个带有绑定变量的匿名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代码将使用带有“?”的转义语法来设置变量。所以这个块看起来像这样(如果我错了,请纠正我):
String block = "declare v_return varchar2(30);" +
"begin" +
"? := 300;" +
"select ename into v_return from emp where empno = ?;" +
"end;"
现在,假设我的变量是一个INPUT参数,我必须像这样设置参数:
// omitting the CallableStatement and conn declarations
cs = conn.prepareCall(block);
cs.setInt(parameterIndex, parameterValue);
问题是在我的块中我有两个“?”用于替换绑定参数:v_value。这意味着当使用转义语法时,只会设置1'st “?”。 2'nd “?”将被“悬挂”。
在这种情况下,当在PL / SQL块中多次使用相同的绑定变量时,我应该如何继续在JDBC转义语法中进行转换?
修改
我发现这个question与我的问题有关。我从中理解的是,我必须 REWRITE 所有在同一块中使用多个绑定变量实例的匿名PL / SQL块。这有什么解决方法吗?或者就是这样......游戏结束......这就是JDBC的工作方式,我必须做出应有的决定。
期待一个答案...搜索了2个小时没有结果。
答案 0 :(得分:2)
看看这个doc。
基本上,您可以将与输入和输出相同的变量绑定为:
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);
我希望它有所帮助。
答案 1 :(得分:1)
尝试此查询:
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 );
有关详细信息和示例,请参阅以下链接:
http://docs.oracle.com/cd/E11882_01/java.112/e16548/getsta.htm#JJDBC28075
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#JJDBC28168