如何解决调用存储过程时未分类的 SQL 异常
我正在尝试使用 JDBC 将存储过程调用到 Oracle 数据库,但我遇到了一些问题。
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;
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 举报,一经查实,本站将立刻删除。