java.sql.SQLException:无效的列类型:1111调用具有rowtype返回值

时间:2018-04-12 09:29:47

标签: oracle ojdbc callable-statement

我在Oracle包调用“MyPackage”中有一个函数:

FUNCTION MyFunction(name IN VARCHAR2) RETURN MyTable%rowtype;

我试图通过JDBC调用。

CallableStatement cs = connection.prepareCall("{ ? = call MyPackage.MyFunction(?) }");`
cs.registerOutParameter(1, OracleTypes.OTHER);
cs.setString(2, "SomeString");
cs.executeQuery();

我得到了

Caused by: java.sql.SQLException: Invalid column type: 1111

我尝试过使用OracleTypes.CURSOR和OracleTypes.REF,但都有问题。我想知道我是否需要在这些行中定义STRUCT或其他东西,但因为返回值不是命名类型我不认为我可以使用它?

我也尝试过:

SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate);
call.withCatalogName("MYPACKAGE")
    .withFunctionName("MYFUNCTION");

SqlParameterSource paramMap = new MapSqlParameterSource()
            .addValue("NAME", "SomeString");

Map<String, Object> map = call.execute(paramMap);

这也会产生无效列类型1111错误。 列元数据表明参数是OracleTypes.OTHER

我用来验证列元数据的代码是:

DatabaseMetaData dbMeta = connection.getMetaData();

ResultSet rs =  dbMeta.getProcedureColumns(null, "MYSCHEMA", "%MY_FUNCTION%", "%");

while (rs.next()) {
    String procedureName = rs.getString(3);
    String columnName = rs.getString(4);
    int dataType = rs.getInt(6);
     System.out.println("Procedure Name: " + procedureName + ", Column Name: " + columnName + ", Data Type:" + dataType);
}

这个输出是:

Procedure Name: MYFUNCTION, Column Name: null, Data Type:1111
Procedure Name: MYFUNCTION, Column Name: NAME, Data Type:12

非常感谢任何指导

0 个答案:

没有答案