微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用存储过程时未分类的 SQL 异常

如何解决调用存储过程时未分类的 SQL 异常

我正在尝试使用 JDBC 将存储过程调用到 Oracle 数据库,但我遇到了一些问题。

带有要调用的存储过程的 sql 包定义

create or replace PACKAGE PACK AS
 
 TYPE type_rec IS RECORD (
  module    VARCHAR2(40),value     VARCHAR2(80),message   VARCHAR2(4000));

 TYPE type_msg_array IS VARRAY(250) OF type_rec;

PROCEDURE FUNC (
  provco            IN  VARCHAR2,id             IN  VARCHAR2,code         OUT NUMBER,msg               OUT VARCHAR2,msg_array       IN OUT type_msg_array);
END PACK;

创建请求并调用存储过程的Main方法

public Map<String,Object> executeFunc(final String db,final RequestPojo request) {
    Map<String,Object> inParamMap = new LinkedHashMap<>();
    Map<String,Object> funcOutput = null;
    
    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate(db).getJdbcTemplate().getDataSource());
    
    MessagePojo message = new MessagePojo();
    List<MessagePojo> messageList = new ArrayList<>();
    
    messageList.add(message);
    
    List<Object> objectList = new ArrayList<>(messageList);
    
    try (final Connection connectionWrapper = jdbcCall.getJdbcTemplate().getDataSource().getConnection()){
        buildFuncParameters(jdbcCall,inParamMap,request);

        inParamMap.put("msg_array",new ScriptArray(objectList,connectionWrapper));

        funcOutput = jdbcCall.execute(inParamMap);

    } catch (sqlException sqlEx) {
        throw new DataRetrievalFailureException(sqlEx.getMessage());
    }
    
    return funcOutput;
}

构建请求的帮助方法

private void buildFuncParameters(SimpleJdbcCall jdbcCall,Map<String,Object> inParamMap,RequestPojo request) {
    jdbcCall.withCatalogName("PACK");
    jdbcCall.withProcedureName("FUNC");
    
    jdbcCall.declareParameters(
            new sqlParameter("provco",Types.VARCHAR),new sqlParameter("id",new sqlOutParameter("code",Types.NUMERIC),new sqlOutParameter("msg",new sqlInOutParameter("msg_array",java.sql.Types.ARRAY,"PACK".concat(".TYPE_MSG_ARRAY"))
            );
    jdbcCall.withoutProcedureColumnMetaDataAccess();
    jdbcCall.setAccessCallParameterMetaData(false);
    jdbcCall.withReturnValue();
    
    inParamMap.put("provco",findCritSeqRequest.getProvco());
    inParamMap.put("id",findCritSeqRequest.getId());
}

ScriptArray 实用程序类

public class ScriptArray extends AbstractsqlTypeValue {
    private List<Object> values;
    private Connection oracleConnection;
    
    public ScriptArray(List<Object> values,final Connection oracleConnection) {
        this.values = values;
        this.oracleConnection = oracleConnection;
    }

    @Override
    protected Object createTypeValue(Connection con,int sqlType,String typeName)
            throws sqlException {
       return oracleConnection.unwrap(OracleConnection.class).createARRAY(typeName,values.toArray(new Object[values.size()]));
    }

}

执行后出现如下错误

ERROR org.springframework.jdbc.UncategorizedsqlException: CallableStatementCallback; uncategorized sqlException for sql [{? = call PACK.FUNC(?,?,?)}]; sql state [99999]; error code [17074]; invalid name pattern: PACK.TYPE_MSG_ARRAY; nested exception is java.sql.sqlException: invalid name pattern: PACK.TYPE_MSG_ARRAY

希望你能帮我解决这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。