Вызов функции оракула из Java - PullRequest
1 голос
/ 07 мая 2011

Я создал функцию оракула под названием getEmployee(id in varchar) в моей удаленной базе данных, и я пытаюсь вызвать ее из локальной базы данных, используя ссылку на базу данных.

В getEmployee я пытаюсь вернуть курсор с данными сотрудника (таблица: Employee (ID, Name, address)):

FUNCTION LocalGetEmployee(ID in varchar2)
RETURN Schema.SomeRefCursor AS OUTPUT Schema.SomeRefCursor;

BEGIN 

  OUTPUT := schema.getEmployee@dblink(ID) ;    

  RETURN OUTPUT;

END;

Но когда я вызываю эту функцию из Java-кода, она выдает ошибку ORA-24338: statement handle not executed. Вот моя удаленная функция:

CREATE OR REPLACE FUNCTION GETEMPLOYEE ( IN_ID IN VARCHAR2 ) 
RETURN TYPES.RECORD_CURSOR AS

  RESULT_CURSOR TYPES.RECORD_CURSOR;

BEGIN

   OPEN RESULT_CURSOR FOR 
     SELECT ID, NAME, ADDRESS  
       FROM EMPLOYEE 
      WHERE ID = IN_ID; 

  RETURN RESULT_CURSOR;

END GETEMPLOYEE;

Вот мой код Java:

String fncall = "{call ? :=  schema.LocalGetEmployee(?)}";

CallableStatement stm = con.prepareCall(fncall);
stm.registerOutParameter(1, Types.CURSOR);
stm.setInt(2, 123);
stm.execute();

ResultSet rs = (ResultSet) stm.getObject(1);
while(rs.next()) {
  ......
}

1 Ответ

1 голос
/ 07 мая 2011

Нет смысла использовать рефкурсор, созданный в удаленной базе данных.Ссылка dblink откроет сеанс на удаленном экземпляре, создаст курсор и быстро исчезнет, ​​когда вызов удаленной функции завершится.Следовательно, ваша ошибка ORA-24338 на локальном экземпляре - рефкурсор не указывает ни на что допустимое.

Даже если бы вы могли оставить удаленный сеанс открытым, на что бы указывал рефкурсор?Какая-то область памяти в удаленной базе данных?

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