вызов хранимого процесса через ссылку - PullRequest
4 голосов
/ 14 июля 2009

Я пытаюсь вызвать хранимую процедуру по ссылке в базе данных. Код выглядит примерно так:

declare
       symbol_cursor  package_name.record_cursor;
       symbol_record  package_name.record_name;
begin
       symbol_cursor := package_name.function_name('argument');
loop
       fetch symbol_cursor into symbol_record;
       exit when symbol_cursor%notfound;
       -- Do something with each record here, e.g.:
       dbms_output.put_line( symbol_record.field_a );
end loop;

CLOSE symbol_cursor;

Когда я запускаю это из того же экземпляра БД и схемы, которой принадлежит имя_пакета, я могу запустить его нормально. Однако, когда я запускаю это по ссылке на базу данных (с необходимой модификацией сохраненного имени процесса и т. Д.), Я получаю ошибку оракула: ORA-24338: дескриптор оператора не выполнен.

Модифицированная версия этого кода через ссылку dblink выглядит следующим образом:

declare
       symbol_cursor  package_name.record_cursor@db_link_name;
       symbol_record  package_name.record_name@db_link_name;
begin
       symbol_cursor := package_name.function_name@db_link_name('argument');
loop
       fetch symbol_cursor into symbol_record;
       exit when symbol_cursor%notfound;
       -- Do something with each record here, e.g.:
       dbms_output.put_line( symbol_record.field_a );
end loop;

CLOSE symbol_cursor;

1 Ответ

4 голосов
/ 14 июля 2009

Из другого вашего вопроса я помню, что имя_пакета.record_cursor - тип курсора ref. Курсор ref - это дескриптор памяти, действительный только в той базе данных, в которой он был создан. Другими словами, вы не можете создать реф-курсор в вашей удаленной базе данных и попытаться извлечь из него локальную базу данных.

Если вам действительно нужно обработать данные в вашей локальной БД, а таблицы должны оставаться в удаленной БД, тогда вы можете переместить пакет "имя_пакета" в вашу локальную БД и заставить его выполнить запрос к таблицам в вашем удаленном дБ через ссылку на базу данных.

...