You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
      // 处理结果集
      

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:40:34