Andreas Senft
May 11th, 2006, 07:47 AM
I just started experimenting with Spring's StoredProcedure support. Simple cases are working fine. However, this one seems to be tricky.
I have a stored procedure (Oracle 9i) with the following signature:
PROCEDURE test(o_date OUT DATE, o_tbl OUT DBMS_SQL.VARCHAR2_TABLE, i_val IN NUMBER)
Now I have a problem declaring the second parameter. I tried this:
declareParameter(new SqlOutParameter("o_tbl", Types.ARRAY, "DBMS_SQL.VARCHAR2_TABLE", new SqlReturnType() {
public Object getTypeValue(CallableStatement pCs, int paramIndex, int pSqlType, String pTypeName) throws SQLException {
// TBD
}
}));
However I received an exception:
org.springframework.jdbc.UncategorizedSQLException : CallableStatementCallback; uncategorized SQLException for SQL [{call tg_dev.test(?, ?, ?)}]; SQL state [null]; error code [17074]; Ungültiges Namensmuster: DBMS_SQL.VARCHAR2_TABLE; nested exception is java.sql.SQLException: Ungültiges Namensmuster: DBMS_SQL.VARCHAR2_TABLE
java.sql.SQLException: Ungültiges Namensmuster: DBMS_SQL.VARCHAR2_TABLE
at oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:162)
at oracle.jdbc.oracore.OracleTypeADT.initMetadata(Ora cleTypeADT.java:412)
at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeA DT.java:327)
at oracle.sql.ArrayDescriptor.initPickler(ArrayDescri ptor.java:1300)
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:156)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayD escriptor.java:113)
at oracle.jdbc.driver.NamedTypeAccessor.otypeFromName (NamedTypeAccessor.java:92)
at oracle.jdbc.driver.TypeAccessor.initMetadata(TypeA ccessor.java:89)
at oracle.jdbc.driver.T4CCallableStatement.allocateAc cessor(T4CCallableStatement.java:500)
at oracle.jdbc.driver.OracleCallableStatement.registe rOutParameterInternal(OracleCallableStatement.java :129)
at oracle.jdbc.driver.OracleCallableStatement.registe rOutParameter(OracleCallableStatement.java:168)
at org.springframework.jdbc.core.CallableStatementCre atorFactory$CallableStatementCreatorImpl.createCal lableStatement(CallableStatementCreatorFactory.jav a:201)
at org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:803)
at org.springframework.jdbc.core.JdbcTemplate.call(Jd bcTemplate.java:842)
at org.springframework.jdbc.object.StoredProcedure.ex ecute(StoredProcedure.java:100)
"Ungültiges Namensmuster" means "invalid name pattern".
Has someone an idea about how to declare this correctly?
Thanks in advance,
Andreas
P.S.: The stored procedure itself is working fine, when invoked from a database client.
I have a stored procedure (Oracle 9i) with the following signature:
PROCEDURE test(o_date OUT DATE, o_tbl OUT DBMS_SQL.VARCHAR2_TABLE, i_val IN NUMBER)
Now I have a problem declaring the second parameter. I tried this:
declareParameter(new SqlOutParameter("o_tbl", Types.ARRAY, "DBMS_SQL.VARCHAR2_TABLE", new SqlReturnType() {
public Object getTypeValue(CallableStatement pCs, int paramIndex, int pSqlType, String pTypeName) throws SQLException {
// TBD
}
}));
However I received an exception:
org.springframework.jdbc.UncategorizedSQLException : CallableStatementCallback; uncategorized SQLException for SQL [{call tg_dev.test(?, ?, ?)}]; SQL state [null]; error code [17074]; Ungültiges Namensmuster: DBMS_SQL.VARCHAR2_TABLE; nested exception is java.sql.SQLException: Ungültiges Namensmuster: DBMS_SQL.VARCHAR2_TABLE
java.sql.SQLException: Ungültiges Namensmuster: DBMS_SQL.VARCHAR2_TABLE
at oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:162)
at oracle.jdbc.oracore.OracleTypeADT.initMetadata(Ora cleTypeADT.java:412)
at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeA DT.java:327)
at oracle.sql.ArrayDescriptor.initPickler(ArrayDescri ptor.java:1300)
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:156)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayD escriptor.java:113)
at oracle.jdbc.driver.NamedTypeAccessor.otypeFromName (NamedTypeAccessor.java:92)
at oracle.jdbc.driver.TypeAccessor.initMetadata(TypeA ccessor.java:89)
at oracle.jdbc.driver.T4CCallableStatement.allocateAc cessor(T4CCallableStatement.java:500)
at oracle.jdbc.driver.OracleCallableStatement.registe rOutParameterInternal(OracleCallableStatement.java :129)
at oracle.jdbc.driver.OracleCallableStatement.registe rOutParameter(OracleCallableStatement.java:168)
at org.springframework.jdbc.core.CallableStatementCre atorFactory$CallableStatementCreatorImpl.createCal lableStatement(CallableStatementCreatorFactory.jav a:201)
at org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:803)
at org.springframework.jdbc.core.JdbcTemplate.call(Jd bcTemplate.java:842)
at org.springframework.jdbc.object.StoredProcedure.ex ecute(StoredProcedure.java:100)
"Ungültiges Namensmuster" means "invalid name pattern".
Has someone an idea about how to declare this correctly?
Thanks in advance,
Andreas
P.S.: The stored procedure itself is working fine, when invoked from a database client.