Java调用PL/SQL传参触发ORA-01008 并非所有变量都已绑定
问题原因与解决方案
核心报错原因
- 带
?占位符的PL/SQL语句不能使用普通Statement执行,仅PreparedStatement/CallableStatement支持参数绑定,这是触发ORA-01008的核心原因 - 你PL/SQL里的
?占位符属于传入的sqlQuery本身,和后续读取dbms_output的CallableStatement无关联,参数不需要绑定到后面的call对象上
语法错误修正
你的原有代码还存在多处语法错误,需要先修复:
- 执行
dbms_output.enable的SQL语句末尾缺少闭合双引号 - 读取输出的
prepareCall语句末尾缺少闭合双引号 CallableStatement定义在try块内部,块外无法访问,作用域错误
修正后完整代码
import java.sql.Array; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.Statement; import java.sql.Types; import java.util.Arrays; // 假设conn为已经正确初始化的Oracle数据库连接对象 public static void getData(String sqlQuery, String myStrValue) throws SQLException{ // 启用dbms_output Statement enableStmt = conn.createStatement(); try{ enableStmt.executeUpdate("begin dbms_output.enable();end;"); } finally { enableStmt.close(); } // 用PreparedStatement执行带占位符的自定义PL/SQL,完成参数绑定 PreparedStatement plsqlStmt = conn.prepareStatement(sqlQuery); try{ // 占位符下标从1开始,对应PL/SQL里的myStr变量 plsqlStmt.setString(1, myStrValue); plsqlStmt.executeUpdate(); } finally { plsqlStmt.close(); } // 读取dbms_output输出内容 CallableStatement call = conn.prepareCall("declare num integer := 10000; begin dbms_output.get_lines(?, num); end;"); try{ 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(); } } finally { call.close(); } }
调用示例
// 传入你定义的PL/SQL语句和要绑定的myStr参数值即可 getData(plSqlQuery, "abcdefg");
内容的提问来源于stack exchange,提问作者EdXX
相关产品推荐
相关产品推荐

