将参数传递给callableSatatement-ORA-01008:并非所有变量都绑定



我有一个参数为的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:并非所有变量都绑定

我试着两者都诚实,但都没有成功。

如果将字符串plSqlQuery作为参数传递给getData()方法(例如,通过调用getData(plSqlQuery)(,则会遇到ORA-0008"并非所有变量都绑定"错误,因为您没有为?占位符指定值。

不能使用带有占位符的普通Statement,必须使用PreparedStatement

尝试更换线路

s.executeUpdate(sqlQuery);

带有

try (PreparedStatement pstmt = conn.prepareStatement(sqlQuery)) {
pstmt.setString(1, "Some Value Here");
pstmt.execute();
}

我想明白了。它适用于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();

最新更新