2016-09-20 3 views
0

JavaからINパラメータが "Type"であるストアドプロシージャを呼び出す必要があります。下記を参照してください。 "CusInfoList IN CUSTOMER_INFO_LIST - TYPE"をJavaを使用して設定するには?次のようにJavaでユーザ定義のSQL型を設定する

SQL> create or replace procedure insert_XXXX 
    2 (
    3 L_TXN_ID VARCHAR2 
    4 ,L_RESOLUTION_ID NUMBER 
    5 ,L_COMPENSATION_TYPE  VARCHAR2 
    6 ,L_COMPENSATION_VALUE  NUMBER 
    7 ,L_CLAIM_TYPE  VARCHAR2 
    8 ,L_CLAIM_DETAIL VARCHAR2 
    9 ,L_VOUCHER_TYPE_CODE  VARCHAR2 
10 ,L_REMARKS VARCHAR2 
11 ,L_OTH_REMARKS  VARCHAR2 
12 ,L_STATUS  VARCHAR2 
13 ,L_OVERRIDE_FLAG CHAR 
14 ,L_EMP_NUMBER  VARCHAR2 
15 ,L_AGENT_LOCATION VARCHAR2 
16 ,L_LST_UPDATED_TIMESTAMP TIMESTAMP 
17 ,L_CREATED_TIMESTAMP  TIMESTAMP DEFAULT SYSDATE 
18 ,L_CODE VARCHAR2 
19 ,L_FL_NO  NUMBER 
20 ,L_FL_DATE DATE 
21 ,L_FL_STA VARCHAR2 
22 ,L_FL_A_STA VARCHAR2 
23 ,L_RECORD_LOCATOR   VARCHAR2 
24 ,L_RECORD_CREATE_DATE DATE 
25 **,CusInfoList IN CUSTOMER_INFO_LIST -- TYPE** 
26 ) 
27 IS 
28 begin 
29 SAVEPOINT ins_sp; 

タイプCUSTOMER_INFO_LISTが宣言されている:あなたがする必要があるいくつかのものがあります

CREATE OR REPLACE TYPE CUSTOMER_INFO_TYPE AS OBJECT (
    LAST_NAME VARCHAR2(20 CHAR), 
    FIRST_NAME VARCHAR2(20 CHAR), 
    CUST_NUMBER NUMBER, 
    LOY_NUMBER VARCHAR2(10 CHAR), 
    HEL_SCORE NUMBER, 
    TIER_STATUS VARCHAR2(25 CHAR), 
    EMAIL_ADDRESS VARCHAR2(50 CHAR), 
    PHONE_NUMBER VARCHAR2(20 CHAR), 
    MAILING_ADDRESS VARCHAR2(100 CHAR), 
    CASE_NUMBER VARCHAR2(50 CHAR), 
    CASE_STATUS VARCHAR2(20 CHAR) 
); 

CREATE OR REPLACE TYPE isolve.CUSTOMER_INFO_LIST AS VARRAY(25) OF ISOLVE.CUSTOMER_INFO_TYPE; 

答えて

0

第1に、クラスに対応するSQLDataを実装するクラス(CustomerInfo)を作成する必要があります。このクラスはCUSTOMER_INFO_TYPEクラスに対応しています。 Oracle documentationには、そのようなクラスがどのように見えるかの例が含まれています。私はあなたのタイプがかなりのプロパティを持っているので、このクラスを完全に書き出すつもりはありません。

また、接続のタイプマップにタイプマッピングを追加する必要があります。これは私がリンクしているページでカバーされているものでもあります。

これを実行したら、CUSTOMER_INFO_LISTオブジェクトをCustomerInfoオブジェクトの配列として次のように使用して渡すことができます。配列の作成に使用する正確なコードは、使用しているOracle JDBCドライバJARのバージョンによって異なります。

CustomerInfo[] customerInfos = ... ; // get these from somewhere 
Connection conn = ... ; // database connection 

// if using ojdbc7.jar, requires 'import oracle.jdbc.OracleConnection' 
Array array = ((OracleConnection)conn).createOracleArray("ISOLVE.CUSTOMER_INFO_LIST", customerInfos); 

// if using ojdbc6.jar or earlier, requires 'import oracle.sql.ARRAY' 
// and 'import oracle.sql.ArrayDescriptor' 
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("ISOLVE.CUSTOMER_INFO_LIST", conn); 
ARRAY array = new ARRAY(arrayDesc, conn, customerInfos); 

CallableStatement statement = conn.prepareCall("...."); 
statement.setString(1, transactionId); 
// ... more parameters ... 
statement.setArray(NNN, array); // replace NNN with parameter number 
+0

こんにちはルーク、ありがとうございます。私はあなたから与えられたステップに従った。しかし、一点で立ち往生した。 「java.sql.SQLException:記述子を構築できません:無効な引数」というエラーが表示される – SJM

+0

以下のコードをご覧ください。このエラーは、 "ARRAY array = new ARRAY(arrayDesc、databaseConnection、customerInfos);"を設定しているステートメントで発生しています。私はojdbc14.jarを使用していることに注意してください。 – SJM

+0

List custinfoArray = new ArrayList (); int i = 2; java.util.Map map = databaseConnection.getTypeMap(); map.put( "CUSTOMER_INFO_TYPE"、Class.forName( "CustomerInfo")); databaseConnection.setTypeMap(map);for(int j = 0; j SJM

関連する問題