我正在使用JDev 11.1.1.7.0 和oracle Exp 11g DB
在我的ADF应用程序中,我试图调用存储过程,但我一直收到错误,最后一个是"无效列类型:1111"。
我认为问题出在这一行
st.registerOutParameter(8,Types.OTHER);
我的AppModuleImpl完整方法:
public Row callProcWithRowOut(Object[] bindVars) {
CallableStatement st = null;
try {
st = getDBTransaction().createCallableStatement("begin ADF_ITEM_SOLD(?,?,?,?,?,?,?,?);end;",getDBTransaction().DEFAULT);
st.registerOutParameter(8,Types.OTHER);
if (bindVars != null) {
for (int z = 0; z < bindVars.length; z++) {
st.setObject(z + 1, bindVars[z]);
}
}
st.executeUpdate();
return (Row)st.getObject(8);
} catch (SQLException e) {
throw new JboException(e);
} finally {
if (st != null) {
try {
st.close();
}
catch (SQLException e) {}
}
}
}
追踪:
java.sql.SQLException: Invalid column type: 1111
at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:5344)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:153)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:399)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:581)
at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1765)
at weblogic.jdbc.wrapper.CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper.registerOutParameter(Unknown Source)
at model.BC.AppModule.AppModule_AMImpl.callProcWithRowOut(AppModule_AMImpl.java:1793)
at model.BC.Views.SalesInvoiceItems_VOImpl.insertItems(SalesInvoiceItems_VOImpl.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at oracle.adf.model.binding.DCInvokeMethod.invokeMethod(DCInvokeMethod.java:657)
at oracle.adf.model.binding.DCDataControl.invokeMethod(DCDataControl.java:2143)
at oracle.adf.model.bc4j.DCJboDataControl.invokeMethod(DCJboDataControl.java:3118)
at oracle.adf.model.binding.DCInvokeMethod.callMethod(DCInvokeMethod.java:261)
at oracle.jbo.uicli.binding.JUCtrlActionBinding.doIt(JUCtrlActionBinding.java:1635)
at oracle.adf.model.binding.DCDataControl.invokeOperation(DCDataControl.java:2150)
at oracle.jbo.uicli.binding.JUCtrlActionBinding.invoke(JUCtrlActionBinding.java:740)
at oracle.adf.controller.v2.lifecycle.PageLifecycleImpl.executeEvent(PageLifecycleImpl.java:407)
at oracle.adfinternal.view.faces.model.binding.FacesCtrlActionBinding._execute(FacesCtrlActionBinding.java:252)
at oracle.adfinternal.view.faces.model.binding.FacesCtrlActionBinding.execute(FacesCtrlActionBinding.java:210)
at view.backing.SalesInvoicesUpdate.insertItems_action(SalesInvoicesUpdate.java:281)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.el.parser.AstValue.invoke(Unknown Source)
at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:46)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:190)
可能是什么问题?
感谢您的时间。
答案 0 :(得分:0)
正如我在评论中已经说过的那样,通常不可能调用返回non-sql
类型的存储过程(使用特定于数据库的API有一些例外)。由于%ROWTYPE
是Pl/Sql
类型,因此您必须修改您的过程以返回受支持的(即SQL
)类型。最简单的方法是返回与%ROWTYPE
对应的一些OUT参数,或者你甚至可以返回一个简单的字符串/ varchar(这个字符串可能包含所有属性的逗号分隔列表),然后解析这个客户端(Java)端的字符串。
我还在这里写了一个简单的例子来说明如何处理这种情况(http://easyorm.info/SProc)。此示例使用EasyORM库(简单JDBC
包装器),而不是普通JDBC,但它应该让您了解如何修改存储过程。
您还可以将%ROWTYPE
编码为Oracle对象(sql
类型)并让存储过程返回该对象,但这种方法更复杂(有关示例,请参阅Mapping an Oracle stored procedure result to a custom Java type (class))