【发布时间】:2016-09-27 13:45:00
【问题描述】:
我正在尝试从 JDBC 调用以下 pl/sql 过程。
create or replace PACKAGE test AS
type testrec_r is record (
val1 number,
val2 varchar2(100)
);
type testarr_t is table of testrec_r index by binary_integer;
function test_func(i_data in testarr_t, o_sum out number, o_totallength out number) return number;
END test;
这就是我尝试调用它的方式,但没有成功:
StructDescriptor recDescriptor = StructDescriptor.createDescriptor("test.testrec_r", conn);
STRUCT[] RECORDS_ARRAY = new STRUCT[2];
for (int i = 0; i < 2; i++) {
STRUCT oracle_record = new STRUCT(recDescriptor, conn, new
Object[] {i, "test"});
RECORDS_ARRAY[i] = oracle_record;
}
CallableStatement stmt = conn.prepareCall("{ call TEST.TEST_FUNC(?, ?, ?) }");
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("TEST.TESTARR_T", conn);
ARRAY oracle_array = new ARRAY(arrayDescriptor, conn, RECORDS_ARRAY);
// Bind the input record
stmt.setArray(1, oracle_array);
stmt.registerOutParameter(2, Types.NUMERIC);
stmt.registerOutParameter(3, Types.NUMERIC);
stmt.executeUpdate();
double out1 = stmt.getDouble(2);
double out2 = stmt.getDouble(3);
return new Object[] { out1, out2 };
我刚刚读到 oracle jdbc 不支持 pl/sql 结构类型。所以,这失败了“无效的名称模式:test.testrec_r”
如何从 Java 调用此过程?理想情况下只使用 java libray/API,但这似乎几乎不可能,这是将 pl/sql 包包装在简单的 sql 调用中并调用它的最佳解决方法?
P.S 我正在使用 Spring JDBCTemplate 进行数据库连接。
【问题讨论】: