我有一个参数为的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();