«SQLException: ORA-06550» при вызове функции PL / SQL из Java - PullRequest
2 голосов
/ 26 ноября 2011

Я хочу использовать 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();
}

Код выдает следующее исключение:

 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)

Почему?

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

Возможные причины ошибки: (во фрагменте - функция)

1.Пакет "types" не существует.

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

2 Недопустимый оператор выбора SQL (таблица или столбец были удалены или изменены после создания функции).

Вам необходимо написатьnew function с оператором simple sql и запустите его с приглашением Sql и кодом Java.

0 голосов
/ 26 ноября 2011

Создана ли функция без ошибок? Если тип или какие-либо таблицы отсутствуют, функция будет создана, но тело функции будет недопустимым, поскольку не может быть скомпилировано.

Если функция была создана без ошибки, а затем объект, от которого она зависит, удаляется или изменяется, функция будет помечена как недопустимая и может быть перекомпилирована, но затем может завершиться ошибкой, если не может быть скомпилирована (отсутствует таблица или столбец или что угодно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...