вызов хранимой процедуры через dblink

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

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;

Когда я запускаю это из того же экземпляра БД и схемы, к которой принадлежит package_name, я могу запустить его нормально. Однако, когда я запускаю это по ссылке базы данных (с необходимой модификацией сохраненного имени процедуры и т. д.), я получаю ошибку оракула: 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;

person neesh    schedule 13.07.2009    source источник
comment
Дубликат stackoverflow.com/questions/1119306/   -  person skaffman    schedule 14.07.2009
comment
Я не согласен с тем, что это дубликат того вопроса, который касается выполнения динамического кода через dblink.   -  person Tony Andrews    schedule 14.07.2009


Ответы (1)


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

Если вам действительно нужно обрабатывать данные в вашей локальной базе данных, а таблицы должны оставаться в удаленной базе данных, вы можете переместить пакет «package_name» в свою локальную базу данных и выполнить запрос к таблицам в вашей удаленной базе данных через ссылка на базу данных.

person Juergen Hartelt    schedule 13.07.2009
comment
Это имеет смысл для меня. Однако (простите за мое невежество), как работают курсоры ref при возврате по ссылке jdbc? Разве он не используется в другом пространстве памяти и в этом случае? Благодарю. - person neesh; 14.07.2009
comment
Приложение обращается к базе данных через соединение jdbc. Ваше приложение действительно может получить курсор ссылки из хранимой процедуры. Но вы бы не использовали этот ref-курсор локально/на стороне приложения. Вместо этого вы должны передать курсор ref обратно в базу данных для операций выборки. Вы в основном сообщаете базе данных, что она дает мне набор результатов, связанный с этим дескриптором здесь. - person Juergen Hartelt; 14.07.2009