调用管道oracle函数frm java类
基本上我想做的是从我的java类中调用一个oracle管道函数。这个oracle函数只有一个out参数。如果您试图在PL/SQL中调用管道函数,即在SQL之外,您将得到一个错误调用管道oracle函数frm java类,java,oracle,jdbc,Java,Oracle,Jdbc,基本上我想做的是从我的java类中调用一个oracle管道函数。这个oracle函数只有一个out参数。如果您试图在PL/SQL中调用管道函数,即在SQL之外,您将得到一个错误PLS-00653:在PL/SQL范围内不允许使用聚合/表函数 如果您尝试在SQL中调用带有OUT参数的函数,您将得到一个错误ORA-06572:函数MYFUNC有OUT参数 所以,把这两个放在一起,如果你有一个带有OUT参数的流水线函数,你不能在SQL中调用它,也不能在SQL外部调用它。换句话说,你根本不能叫它。基本上,
PLS-00653:在PL/SQL范围内不允许使用聚合/表函数
如果您尝试在SQL中调用带有OUT
参数的函数,您将得到一个错误ORA-06572:函数MYFUNC有OUT参数
所以,把这两个放在一起,如果你有一个带有OUT
参数的流水线函数,你不能在SQL中调用它,也不能在SQL外部调用它。换句话说,你根本不能叫它。基本上,这是一个无用的函数。为什么Oracle允许您编译它是一个谜
您需要修改您的函数,使其(a)不是管道化的,或者(b)没有
OUT
参数。在这里,我看不出有任何特殊需要使用CallableStatement对象从包函数中获取表数据。
相反,我们可以使用普通的sql查询来包装结果,并将其提取到普通的java结果集中。
这样做,我们避免了试图找到一个痛苦的解决方案来调整包函数(使用包级别类型),保持函数和包类型不变,并继续受益于使用管道化plsql函数未知的内部功能和速度。
Panos Zafiropoulos。您能提供更多信息吗?我有一个oracle管道函数,它返回oracle集合。我需要java代码来调用这个管道函数并获取这个oracle collectionCallableStatement ftRPCaStmt=conn.prepareCall(“我的函数的开始名();结束;”);ftRPCaStmt.registerOutParameter(1,OracleTypes.ARRAY,MY_ORACLE_集合);System.out.println(“collection>>>>”+(ftRPCaStmt.getObject(1));这是我调用管道函数的代码。但我得到了下面的错误。“main”java.sql.SQLException:Invalid column index ftRPCaStmt.execute()@用户2500313:我一点也不奇怪你会犯这样的错误。您试图告诉JDBC CallableStatement中的第一个占位符(
?
)是out参数,但CallableStatement中没有任何占位符。此外,您是否按照我的建议重写了您的函数,或者您是否仍打算以某种方式调用您的函数,尽管实际上无法调用它?