【问题标题】:java.sql.SQLException: Invalid argument(s) in call in Passing custom array to procedurejava.sql.SQLException:将自定义数组传递给过程中的调用中的参数无效
【发布时间】:2018-04-04 04:12:33
【问题描述】:

我正在尝试调用具有自定义类型值的过程但出现错误

java.sql.SQLException:调用中的参数无效。

不知道哪里出了问题?

甲骨文代码:

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
)

创建或替换类型 ary_cms_custodian_exigo_code 作为 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 代码:

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);

【问题讨论】:

  • 我可以看到一个可能的问题,但我正在努力获得与您看到的相同的错误。您的代码中的哪一行是该异常被抛出的;您使用的是哪个版本的 Oracle、Java 和 JDBC 驱动程序?
  • Oracle:10,Java 8 ,JDBC14
  • 如果我评论 callstSave.registerOutParameter(1, OracleTypes.ARRAY);能够调用程序但不能退出数组..

标签: java arrays oracle stored-procedures jdbc


【解决方案1】:

我无法完全复制您所看到的内容,因为我没有可用的 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() 来查看实际的数组大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多