I want to use Java to retrieve data from database and display it, so I created this PL/SQL function, which returns a cursor:
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;
In my Java code, I call the function as follows:
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(); }
The code produces the following 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)
Why?