3

我在 oracle 中的过程是在一个包下定义的,该包具有记录表的输入和输出参数。我可以使用 java 中的可调用语句使用 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 代码中访问这种类型。

4

2 回答 2

2

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); 
于 2016-01-07T20:46:22.530 回答
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();
于 2014-09-23T07:44:42.073 回答