【问题标题】:java.sql.SQLException: Invalid column type: 1111 when calling function with rowtype return valuejava.sql.SQLException:无效的列类型:1111 调用具有行类型返回值的函数时
【发布时间】:2018-04-12 09:29:46
【问题描述】:

我在一个名为“MyPackage”的 Oracle 包中有一个函数:

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);

这也会产生 Invalid column type 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

任何指导将不胜感激

【问题讨论】:

    标签: oracle ojdbc callable-statement


    【解决方案1】:

    我在这个问题上可能为时已晚,但对于仍有此问题的人可能会得到帮助。

    在您的函数中,您指定了一个 in 参数(IN name),但在您的 callableStatement 中,您注册了一个未包含在函数中的 out 参数。要获取您的表 rawtype,您可以同时使用函数和过程。供程序使用

    PROCEDURE MyFunction(results OUT SYS_REFCURSOR,name IN VARCHAR2);
    

    然后在你的可调用语句中,你可以像你一样注册一个 out 参数。

    对于函数,你可以这样做

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

    那么你的java代码就是

    SimpleJdbcCall executor = new SimpleJdbcCall(jdbcTemplate).withSchemaName("schema_name").withCatalogName("packageName").withFunctionName("myFunction");
                
    MapSqlParameterSource param = new MapSqlParameterSource().addValue("NAME", someString);
    
    List<Map<String, Object>> tablerow = executor.executeFunction(String.class, param);
    

    该错误是由于注册了一个未在您的函数中定义的参数类型 111 的 out 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2018-01-19
      相关资源
      最近更新 更多