使用JDBC编写带有绑定变量的匿名PL / SQL块

时间:2013-10-28 17:33:33

标签: 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代码将使用带有“?”的转义语法来设置变量。所以这个块看起来像这样(如果我错了,请纠正我):

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个小时没有结果。

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