java - 使用 JDBC 编写带有绑定(bind)变量的匿名 PL/SQL block

标签 java oracle jdbc plsql

我有一个带有绑定(bind)变量的匿名 PL/SQL block ,我想通过 JDBC 运行它。

PL/SQL block 示例:

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

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);

问题是在我的 block 中我有两个 "?" 用于替换绑定(bind)参数 :v_value。这意味着当使用转义语法时,只会设置第一个 "?"。第二个 "?" 将保留为“悬空”。

在这种情况下,当在 PL/SQL block 中多次使用相同的绑定(bind)变量时,我应该如何继续将其转换为 JDBC 转义语法?

编辑:

我找到了这个 question在与我的问题相关的 SO 上。我从中了解到,我必须重写所有在同一个 block 中使用多个绑定(bind)变量实例的匿名 PL/SQL block 。有什么解决方法吗?或者就是这样……游戏结束了……这就是 JDBC 的工作方式,我将不得不做出应有的贡献。



期待答案...为此搜索了 2 小时,但没有结果。

最佳答案

看看这个doc .

基本上,您可以像这样将相同的变量绑定(bind)为输入和输出:

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);

希望对你有帮助。

关于java - 使用 JDBC 编写带有绑定(bind)变量的匿名 PL/SQL block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641333/

相关文章:

jdbc - 与连接 : What happened?

java - 使用 Robolectrics 和 Mockito 来模拟/ stub 函数调用发出 http 请求,但它不起作用

java - 添加java程序的分数无法正常工作

java - 使用变量初始化整数数组

java - 使用 TRUNC 和 TO_DATE() 在 oracle 中截断 java 格式的日期

oracle - NVARCHAR 到 VARCHAR 之间的转换

oracle - 我未使用的 LOB 字段上的 ora 22992

java - SQL Server JDBC 的 table.field 表示法?

java - 将文件作为链接而不是邮件中的附件发送

java - 插入查询不起作用