将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定
Posted
技术标签:
【中文标题】将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定【英文标题】:Passing parameter to callableSatatement - ORA-01008: not all variables bound 【发布时间】:2021-07-03 19:58:46 【问题描述】:我有一个带有参数的 PL/SQL 查询:
plSqlQuery = "declare "
+ " num integer := 1000;"
+ " myStr varchar2(100):= ?;"
+ "begin "
+ " dbms_output.put_line('abc');"
+ " dbms_output.put_line('hello');"
+ " dbms_output.put_line(myStr);"
+ "end;"
我的 Java 方法是这样的:
public static void getData(String sqlQuery) throws SQLException, IOException
Statement s =conn.createStatement();
try
s.executeUpdate("begin dbms_output.enable();end;);
s.executeUpdate(sqlQuery);
try
CallableStatement call = conn.prepareCall("declare num integer = 10000; begin dbms_output.get_lines(?, num); end;)
call.registerOutParameter(1,Types.ARRAY, "DBMSOUTPUT_LINESARRAY");
call.execute();
Array array = null;
try
array = call.getArray(1);
System.out.println(Arrays.asList((Object[])
array.getArray()));
finally
if (array != null)
array.free();
现在有了以上两个,我想执行我的 getData 方法,但我不知道如何将参数传递给它 (myStr)。
您能告诉我应该在我的 Java 方法中的哪个位置设置字符串参数吗?
应该是这样的
s.setString(x, "abcdefg");
或
call.setString(2, "abcdefg");
它给了我一个类似的 Oracle 错误
ORA-01008:并非所有变量都绑定
说实话,我都试过了,但都没有成功。
【问题讨论】:
call.setString(x, "abcdefg"); 并更好地使用 executeQuery() 嗨@kofemann,我添加了 call.setString(2, "abcdefg"); call.executeQuery(): 但我收到类似“ORA-01008: not all variables bound”的错误 参考***.com/questions/47830370/…或许你也应该参考docs.oracle.com/javase/tutorial/jdbc/index.html 我做了,但是没有传递给 oracle pl/sql 的参数。没有参数它工作正常,我同意 【参考方案1】:如果您将字符串 plSqlQuery
作为参数传递给您的 getData()
方法(例如,通过调用 getData(plSqlQuery)
),那么您将遇到 ORA-01008 'not all variables bound' 错误,因为您正在未指定 ?
占位符的值。
您不能将普通的Statement
与占位符一起使用,而必须使用PreparedStatement
。
换行试试
s.executeUpdate(sqlQuery);
与
try (PreparedStatement pstmt = conn.prepareStatement(sqlQuery))
pstmt.setString(1, "Some Value Here");
pstmt.execute();
【讨论】:
【参考方案2】:我想通了。 它适用于 3 种不同的语句:(
Statement s = conn.createStatement();
s.executeUpdate("begin dbms_output.enable();end;);
PreparedStatement ps = conn.prepareStatement(sqlQuery);
ps.setString(1, "abcdefg");
CallableStatement call = conn.prepareCall("declare num integer = 10000; begin dbms_output.get_lines(?, num); end;)
call.registerOutParameter(1,Types.ARRAY, "DBMSOUTPUT_LINESARRAY");
call.execute();
【讨论】:
以上是关于将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定的主要内容,如果未能解决你的问题,请参考以下文章