内部错误:图像是集合图像,期望使用 Oracle 进行 ADT

Posted

技术标签:

【中文标题】内部错误:图像是集合图像,期望使用 Oracle 进行 ADT【英文标题】:Internal Error: Image is a collection image,expecting ADT with Oracle 【发布时间】:2011-05-26 14:55:10 【问题描述】:

我正在尝试使用 spring-jdbc 调用 oracle 数据库上的存储函数。

这是我试图调用的存储函数:

FUNCTION GET_RESOURCE_LIST RETURN RESOURCE_TAB;

接下来是resource_tab的定义

TYPE RESOURCE_TAB AS TABLE OF TRESOURCE;

接下来是tresource的定义

TYPE TRESOURCE AS OBJECT(
RESOURCE_ID NUMBER(10,0),
RESOURCE_NAME VARCHAR2(100)
)

调用代码

final SimpleJdbcCall call = new SimpleJdbcCall(idmJdbcTemplate).withFunctionName("get_resource_list").declareParameters(new SqlOutParameter(
        "RETURN", OracleTypes.STRUCT,
        "RESOURCE_TAB",
        new SqlReturnType() 

          @Override
          public Object getTypeValue(CallableStatement cs, int paramIndex, int sqlType, String typeName) throws SQLException 
            final Struct s = (Struct)cs.getObject(paramIndex);
            final Object[] attr = s.getAttributes();
            return attr[1];
                       
        ));

call.compile();
final Collection<String> resources = call.executeFunction(Collection.class);

最后是我收到的堆栈跟踪:

org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [? = call WVUID.IDM_REPO_MANUAL.GET_RESOURCE_LIST()]; SQL state [99999]; error code [17001]; Internal Error: Image is a collection image,expecting ADT; nested exception is java.sql.SQLException: Internal Error: Image is a collection image,expecting ADT
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:969)
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1003)
    Truncated. see log file for complete stacktrace

Caused By: java.sql.SQLException: Internal Error: Image is a collection image,expecting ADT
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    Truncated. see log file for complete stacktrace
> 
    at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:1015)
    at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:1)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:953)
    ... 62 more

【问题讨论】:

Oracle 的哪个版本?哪个版本的 JDBC 驱动程序? Oracle 11G 和 Weblogic 10.3.2.0 上的驱动程序我猜是一样的。 【参考方案1】:

我有同样的问题,我花了一天时间来解决它。 考虑错误“图像是集合图像”,而不是

OracleTypes.STRUCT 必须是 OracleTypes.ARRAY

关于你的 getTypeValue(...) 方法我不能说它是否正确,但我会展示如何解析结果集(也许它是和其他方式,请写出来):

@Override
public Object getTypeValue(CallableStatement cs, int paramIndex,
        int sqlType, String typeName) throws SQLException 

    ARRAY struct = (ARRAY) cs.getObject(paramIndex);

    ResultSet rs = struct.getResultSet();

    while (rs.next()) 
        Object rowIndex = rs.getObject(1);
        oracle.sql.STRUCT row = (oracle.sql.STRUCT) rs.getObject(2);
        if (row != null) 
            Object[] cols = row.getAttributes();
            System.out.print(rowIndex + ": ");
            for (Object col : cols) 
                System.out.print(col + " ");
            
            System.out.println();
        
    

    return "construct your data structure above and return here";

另一种方法是

    @Override
public Object getTypeValue(CallableStatement cs, int paramIndex,
        int sqlType, String typeName) throws SQLException 

    ARRAY array = (ARRAY) cs.getObject(paramIndex);

    Object[] rows = (Object[])array.getArray();

    for(Object row : rows)
        Object[] cols = ((oracle.sql.STRUCT)row).getAttributes();
        for (Object col : cols) 
            System.out.print(col + " ");
        
        System.out.println();

    

    return "construct your data structure above and return here";

【讨论】:

我不再在我试图让代码工作的地方工作,所以我无法验证这个答案,但这似乎是最有可能的解决方案。 我也有同样的问题,不是对象类型错误:System.out.println(cs.getObject(paramIndex) 给了我 oracle.sql.STRUCT@【参考方案2】:

问题在于输出参数的声明

final SimpleJdbcCall call = new SimpleJdbcCall(idmJdbcTemplate).withFunctionName("get_resource_list").declareParameters(new SqlOutParameter(
    "RETURN", OracleTypes.STRUCT,
    "RESOURCE_TAB",
    new SqlReturnType() <etc>

返回类型 (TYPE RESOURCE_TAB AS TABLE OF TRESOURCE) 不是 OracleTypes.STRUCT(为对象类型保留)而是 OracleTypes.ARRAY

【讨论】:

以上是关于内部错误:图像是集合图像,期望使用 Oracle 进行 ADT的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle DB 中检索图像

使用 Avplayer ios 10* 的屏幕截图图像是黑色图像

当图像是 UITabBar 的选择时使用原始图像颜色的优雅方式

使用 Visual Basic 确定 TIFF 图像是灰度还是彩色?

CT图像是如何生成的?原始图像要使用啥软件查看?

SO上的用户ID图像是如何生成的?