简体   繁体   中英

Accessing the Custom Object Return type from oracle pl/sql in java

I have created a procedure which signature is as follows :

PROCEDURE CUSTOMER_LIST_FOR_SUSPICIOUS_CHECK (
      pCustNo             NUMBER,
      pCustomerList   OUT EMOB.PKG_FINGER.CUSTOMER_LIST,
      pErrorFlag      OUT VARCHAR2,
      pErrorMessage   OUT VARCHAR2);

So I want to call this procedure from java . I have researched a lot and got the following code :

String query = "begin BIOTPL.PKG_FINGER.CUSTOMER_LIST_FOR_SUSPICIOUS_CHECK(?, ?, ?, ?); end;";
CallableStatement stmt = conn.prepareCall(query);

stmt.setInt(1, 83);
stmt.registerOutParameter(2, OracleTypes.ARRAY, "BIOTPL.PKG_FINGER.CUSTOMER_LIST");
stmt.registerOutParameter(3, OracleTypes.VARCHAR);
stmt.registerOutParameter(4, OracleTypes.VARCHAR);
stmt.execute();

But After executing the above code I am getting the following error :

Mar 18, 2018 10:25:09 AM testsimple.accha getAccha
SEVERE: null
java.sql.SQLException: invalid name pattern: BIOTPL.PKG_FINGER.CUSTOMER_LIST
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:543)
    at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:462)
    at oracle.sql.ArrayDescriptor.initPickler(ArrayDescriptor.java:1678)
    at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:291)
    at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:206)
    at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:175)
    at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:158)
    at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:125)
    at oracle.jdbc.driver.NamedTypeAccessor.otypeFromName(NamedTypeAccessor.java:84)
    at oracle.jdbc.driver.TypeAccessor.initMetadata(TypeAccessor.java:89)
    at oracle.jdbc.driver.T4CCallableStatement.allocateAccessor(T4CCallableStatement.java:629)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:166)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:207)
    at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1584)
    at testsimple.accha.getAccha(accha.java:54)
    at testsimple.accha.main(accha.java:78)

The definition of customer_list is given by as follows :

TYPE CUSTOMER_REC IS RECORD
   (
      CUST_NO     NUMBER,
      CUST_CODE   VARCHAR2 (50),
      CUST_NAME   VARCHAR2 (500)
   );

   TYPE CUSTOMER_LIST IS TABLE OF CUSTOMER_REC
      INDEX BY BINARY_INTEGER;

I cant understand where is the error ? Please help me to resolve the error and get the parameter from oracle pl/sql procedure .

The Oracle driver has a special API for this usecase called registerIndexTableOutParameter . Your code would look like this:

((oracle.jdbc.OracleCallableStatement)stmt).registerIndexTableOutParameter(2, 500, OracleTypes.STRUCT, 0);

See the JavaDoc for more details about what the parameters are: https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleCallableStatement.html#registerIndexTableOutParameter_int__int__int__int_

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM