从Java调用PL / SQL函数时的“SQLException:ORA-06550”

我想使用Java从数据库中检索数据并显示它,所以我创建了这个PL / SQL函数,它返回一个游标:

create or replace function std_getInfoFunc return types.cursortype as my_cursor types.cursorType; begin open my_cursor FOR SELECT s.FirstName, s.LastName, s.Address, s.City, s.Province , s.PostalCode, c.CourseName FROM Students s, Courses c, StudentAndCourses cs Where s.StudentID = cs.StudentID AND c.CourseID = cs.CourseID; Return my_cursor; end; 

在我的Java代码中,我调用函数如下:

 try{ CallableStatement cst=connection.prepareCall("{? = call std_getInfoFunc}"); cst.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); cst.execute(); res=(ResultSet) cst.getObject(1); while(res.next()){ System.out.println(res.getString(1)); } } catch(SQLException e){ e.printStackTrace(); } finally{ res.close(); cst.close(); conn.close(); } 

该代码产生以下exception:

  run: java.sql.SQLException: ORA-06550: line 1, column 13: PLS-00905: object SAS.STD_GETINFOFUNC is invalid ORA-06550: line 1, column 7: PL/SQL: Statement ignored at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:202) at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1005) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3550) at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4710) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374) at DBControler.viewStdInfo(DBControler.java:95) at Test_02.main(Test_02.java:18) 

为什么?

可能的错误原因是:(在代码片段中 – 函数)

1.包“类型”不存在。

  create or replace package types as type cursorType is ref cursor; end; / 

2无效的SQL select语句(创建函数后删除或更改了表或列)。

您需要使用simple sql语句编写一个new function ,并在Sql提示符和Java代码中运行它。

function是否创建没有错误? 如果缺少类型或任何表,则将创建该函数,但该函数的主体将无效,因为它无法编译。

如果创建的函数没有错误,然后删除或更改它所依赖的对象,则该函数将被标记为无效并可能被重新编译,但如果无法编译(缺少表或列或其他),则可能会失败。