Java调用Oracle 21c存储过程报错:Non supported SQL92 token
解决JDBC调用Oracle 21c存储过程报错"Non supported SQL92 token at position: 3"
常见原因及解决步骤
1. 修正存储过程的JDBC调用语法格式
这个错误大多是因为调用存储过程的SQL语句不符合Oracle JDBC驱动的解析要求,尤其是使用了错误的调用格式。
- 错误示例:直接使用
CALL SYSTEM_LOGIN_GET_USER_WITH_PASSWORD('test')(未用JDBC标准的CallableStatement语法包裹) - 正确写法:
- 对于带IN/OUT参数的存储过程,使用
{call 存储过程名(?, ?, ...)}格式:// 假设存储过程接收用户名输入,返回密码输出 String callSql = "{call SYSTEM_LOGIN_GET_USER_WITH_PASSWORD(?, ?)}"; CallableStatement cs = conn.prepareCall(callSql); // 设置输入参数 cs.setString(1, "test_user"); // 注册输出参数(根据实际类型调整) cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); // 获取输出结果 String password = cs.getString(2); - 如果存储过程返回结果集(使用REF CURSOR),则用
{call ? := 存储过程名(?, ?, ...)}格式:String callSql = "{call ? := SYSTEM_LOGIN_GET_USER_WITH_PASSWORD(?)}"; CallableStatement cs = conn.prepareCall(callSql); cs.registerOutParameter(1, OracleTypes.CURSOR); cs.setString(2, "test_user"); cs.execute(); ResultSet rs = (ResultSet) cs.getObject(1); // 处理结果集
- 对于带IN/OUT参数的存储过程,使用
2. 适配Oracle 21c的JDBC驱动版本
确保使用的JDBC驱动是针对Oracle 21c的版本(如ojdbc11.jar),旧版本驱动(如ojdbc8)对21c的新语法特性支持不足,容易触发解析错误。
3. 校验存储过程定义的正确性
确认存储过程的参数类型、数量与调用逻辑完全匹配:
- 示例正确的存储过程定义(结合USERS和USERPASSWORDS表):
CREATE OR REPLACE PROCEDURE SYSTEM_LOGIN_GET_USER_WITH_PASSWORD( p_username IN VARCHAR2, p_out_password OUT VARCHAR2 ) AS BEGIN SELECT up.password INTO p_out_password FROM USERS u INNER JOIN USERPASSWORDS up ON u.user_id = up.user_id WHERE u.username = p_username; EXCEPTION WHEN NO_DATA_FOUND THEN p_out_password := NULL; END; /
4. 检查参数绑定的顺序与类型
确保CallableStatement中设置参数的顺序和存储过程定义的参数顺序一致,参数类型(如VARCHAR、INT)也必须严格匹配,避免类型不兼容导致的解析错误。
内容的提问来源于stack exchange,提问作者FarshiD Naqizadeh
相关产品推荐
相关产品推荐

