3

オラクルでの私の手順は、レコードテーブルの in および out パラメータを持つパッケージの下で定義されています。Java の callable ステートメントを使用して、packagename.procname を使用してプロシージャを呼び出すことができます。ただし、out パラメーターにアクセスするには、ARRAY 型の変数を定義する必要があります。ただし、オラクルのレコードのタイプとレコードのテーブルは、パッケージ内で定義されています。したがって、これらの型は、ARRAYDESCRIPTOR を使用して Java からアクセスすることはできません。

プロシージャとタイプは次のように定義されています。

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 から見えません。

2 つの 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 に答える