我在oracle中的过程是在一个包下定义的,它包含记录表的输入和输出参数。 我可以使用java中的callable语句使用packagename.procname调用该过程。但是要访问out参数,我需要定义一个ARRAY类型的变量。但是oracle中的记录类型和记录表是在包内定义的。因此,使用ARRAYDESCRIPTOR无法从java访问这些类型。
proc和类型定义如下:
CREATE OR REPLACE PACKAGE mypackage IS
TYPE TY_Pos IS RECORD
( cust_id VARCHAR2(9)
, balance NUMBER
);
TYPE TY_TBL IS TABLE OF TY_Pos INDEX BY PLS_INTEGER;
PROCEDURE myproc(inTable IN OUT TY_TBL,
count IN NUMBER,
outTable IN OUT TY_TBL
);
CREATE OR REPLACE PACKAGE BODY mypackage AS
PROCEDURE myproc(inTable IN OUT TY_TBL,
count IN NUMBER,
outTable IN OUT TY_TBL
) as
--proc body
为了访问作为记录表的proc的out变量,我创建数组描述符为
ArrayDescriptor myDescp = ArrayDescriptor.createDescriptor ("TY_TBL", l_con);
但是由于TY_TBL是在包内定义的,因此它会抛出错误。请帮助我如何从我的java代码中访问此类型。
答案 0 :(得分:1)
它不是一个非常干净的解决方案,但它有效
StringBuilder sql = new StringBuilder("DECLARE\n\tarr OTHERPACKAGE.TYPE;\n");
sql.append("BEGIN\n");
for (int i = 0; i < tmpArray.length; i++) {
sql.append("\tarr(").append(i).append(") := '").append(tmpArray[i]).append("';\n");
}
sql.append("\tSCHEMA.PACKAGE.PROC(arr, ?);\n");
sql.append("END;");
Connection conn;
CallableStatement callableStatement = conn.prepareCall(sql.toString());
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
callableStatement.execute();
答案 1 :(得分:0)
TY_TBL是一种Pl / SQL类型,这意味着此类型对于java是不可见的。
我建议创建两个sql类型:
Create or Replace SQL_TY_Pos TYPE AS OBJECT (cust_id VARCHAR2(9), balance NUMBER);
Create or Replace SQL_TY_TBL TYPE IS TABLE OF SQL_TY_Pos INDEX BY PLS_INTEGER;
然后在java中:
ArrayDescriptor myDescp = ArrayDescriptor.createDescriptor ("SQL_TY_TBL", l_con);