【发布时间】: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