Oracle自定义类型调用报错PLS-00302:DBMS_PICKLER组件未声明
解决方案:ORA-06550: component 'DBMS_PICKLER' must be declared
1. 授予DBMS_PICKLER包执行权限
JDBC驱动处理自定义集合类型时会隐式调用SYS用户下的DBMS_PICKLER包,当前数据库用户缺少该权限导致报错。执行以下SQL授权:
GRANT EXECUTE ON SYS.DBMS_PICKLER TO [你的数据库用户名];
2. 修正Spring SimpleJdbcCall的类型配置
确保在调用函数时正确映射自定义VARRAY类型,指定类型名称(Oracle默认大写)和对应的Oracle类型:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate) .withFunctionName("TEST") .declareParameters( new SqlParameter("P_NUMBER_LIST", OracleTypes.ARRAY, "NUM_ARRAY") );
3. 验证自定义数组类型实现类
确保OracleNumberArray类正确实现SQLData接口,正确处理数组的序列化/反序列化:
import java.sql.*; import oracle.sql.*; public class OracleNumberArray implements SQLData { private static final String TYPE_NAME = "NUM_ARRAY"; private BigDecimal[] elements; public OracleNumberArray() {} public OracleNumberArray(BigDecimal[] elements) { this.elements = elements; } @Override public String getSQLTypeName() { return TYPE_NAME; } @Override public void readSQL(SQLInput stream, String typeName) throws SQLException { ARRAY array = (ARRAY) stream.readArray(); elements = (BigDecimal[]) array.getArray(); } @Override public void writeSQL(SQLOutput stream) throws SQLException { ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(TYPE_NAME, stream.getConnection()); ARRAY array = new ARRAY(descriptor, stream.getConnection(), elements); stream.writeArray(array); } // Getter and Setter public BigDecimal[] getElements() { return elements; } public void setElements(BigDecimal[] elements) { this.elements = elements; } }
4. 确保JDBC驱动版本兼容
检查pom.xml中ojdbc版本与Oracle数据库版本匹配,例如Oracle 19c使用ojdbc8:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency>
内容的提问来源于stack exchange,提问作者Eltac Shikhsaidov
相关产品推荐
相关产品推荐

