呼吁在DBLINK一个存储过程(calling a stored proc over a dblin

2019-06-25 19:56发布

我想打电话给在数据库链接的存储过程。 该代码看起来是这样的:

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属于我能够运行正常的。 然而,当我运行这个在数据库链接,(与所需修改的存储过程的名称等),我得到一个Oracle错误: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;

Answer 1:

从另一个你的问题我记得package_name.record_cursor是一个REF游标类型。 一个REF CURSOR是一个内存句柄只有在它是在创建数据库有效。换句话说,你不能创建在远程数据库中的Ref光标并尝试从它的本地数据库读取。

如果你真的需要处理在本地数据库中的数据和表格都留在远程数据库,那么你可以在包“PACKAGE_NAME”移动到本地数据库,并把它在远程数据库通过执行上表查询数据库链接。



文章来源: calling a stored proc over a dblink