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.