2017-10-23 80 views
0

にカスタム配列を渡すには、私はカスタムタイプの値でプロシージャをコールしようとしているが、エラーます。java.sql.SQLException:コールで無効な引数(s)は手順

ます。java.sql.SQLException取得しています:無効な引数を(s)in call。

何が問題なのですか。

ORACLEコード:

CREATE OR REPLACE TYPE obj_cms_custodian_exigo_code 
AS OBJECT 
(
    fund_cust_exigocode_id   NUMBER, 
    portfolio      VARCHAR2(10), 
    custodian_code     VARCHAR2(15), 
    security_exigo_code    VARCHAR2(30), 
    cash_exigo_code     VARCHAR2(30), 



    CONSTRUCTOR FUNCTION obj_cms_custodian_exigo_code(
    fund_cust_exigocode_id   NUMBER, 
    portfolio      VARCHAR2, 
    custodian_code     VARCHAR2, 
    security_exigo_code    VARCHAR2, 
    cash_exigo_code     VARCHAR2 
) 
    RETURN SELF AS RESULT 
) 

obj_cms_custodian_exigo_code

PROCEDURE save_cms_cv_cust_exigo_code 
    (
     p_fund_cust_exigocode   IN OUT ary_cms_custodian_exigo_code, 
     p_user_alias     IN vew_user_alias.alias%TYPE 
) 
    ... 

JavaコードOF TABLE AS TYPEのary_cms_custodian_exigo_code CREATE OR REPLACE:

Object[] array_of_records=new Object[1]; 
Object[] custodianExigoSaveKeyRecord=new Object[5]; 



STRUCT oracleRecord; 

StructDescriptor custodianExigotype; //for type 
ArrayDescriptor custodianExigotypeTable;//for array 



//create descripter for eatch oracle record 

custodianExigotype = StructDescriptor.createDescriptor("OBJ_CMS_CUSTODIAN_EXIGO_CODE", connNative); 


//create a descripter for array of records 
custodianExigotypeTable = ArrayDescriptor.createDescriptor("ARY_CMS_CUSTODIAN_EXIGO_CODE", connNative); 


custodianExigoSaveKeyRecord[0]=Double.parseDouble("123"); 
custodianExigoSaveKeyRecord[1]="abc"; 
custodianExigoSaveKeyRecord[2]="abc"; 
custodianExigoSaveKeyRecord[3]="test"; 
custodianExigoSaveKeyRecord[4]="abc"; 
     System.out.println(" custodian Exigo save 22222222"+i); 

    oracleRecord=new STRUCT(custodianExigotype,connNative,custodianExigoSaveKeyRecord); 
    System.out.println(" custodian Exigo after creating STRUCT"+i); 

    array_of_records[0]=oracleRecord; 

    System.out.println(" custodian save 3333333333"); 

    ARRAY oracleArray=new ARRAY(custodianExigotypeTable,connNative,array_of_records); 

    System.out.println("oracle array .."+oracleArray); 

    System.out.println(oracleArray.getLength()+" length of array .. "+oracleArray.getDescriptor()); 

    callstSave= conn.prepareCall("{call pkg_cms_custodian_exigo_code.save_cms_cv_cust_exigo_code(?,?)}"); 

    callstSave.setArray(1,oracleArray); 
    callstSave.setString(2, "ABCUSER");//custodianExigoVo.getUserId() 



    callstSave.registerOutParameter(1, OracleTypes.ARRAY); 

    System.out.println("before calling proce dure ......"); 

    callstSave.execute(); 

    System.out.println("after calling procedure ........."); 

    Array outarray =callstSave.getArray(1); 
+0

私は考えられる問題を見ることができますが、私はあなたが見ているのと同じエラーを得るのに苦労しています。あなたのコードの中で例外がスローされた行です。どのバージョンのOracle、Java、およびJDBCドライバを使用していますか? –

+0

Oracle:10、Java 8、JDBC14 – Ritesh

+0

私がcallstSave.registerOutParameter(1、OracleTypes.ARRAY)にコメントすると、プロシージャを呼び出すことはできますが配列を取得することはできません。 – Ritesh

答えて

0

を私は正確にあなたがしているものを複製することはできません私はOracle 10g DBを利用できないので見ていますが、わずかに得ることができますあなたのJavaとJDBCのバージョンの違いとは異なるエラー。 (なぜJDBC14を使用しているのかは別の質問ですが、もちろん10gはサポートされていませんが、thisを参照してください。互換性バージョンの詳細については、ドキュメントID 401934.1を参照してください)。これらのエラーはregisterOutParameter()呼び出しでタイプ名を含むことによって解決することができます

:ちなみに

callstSave.registerOutParameter(1, OracleTypes.ARRAY, "ARY_CMS_CUSTODIAN_EXIGO_CODE"); 

oracleArray.getLength()へのお電話は、あなたが何を考えて行くのではありませんし、おそらく常にゼロを返すために起こっています;代わりにoracleArray.length()を使用して実際のアレイサイズを確認してください。

関連する問題