通过数据库链接调用存储过程

4
我正在尝试通过数据库链接调用存储过程。 代码大致如下:
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;

当我在包所属的相同数据库实例和架构中运行时,我能够成功运行它。然而,当我在数据库链接上运行它时(需要修改存储过程名称等),我会收到一个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;

执行数据库链接上的立即语句 - skaffman
我不同意这是那个问题的重复,那个问题是关于通过dblink执行动态代码的。 - Tony Andrews
1个回答

4

根据你之前的问题,我记得package_name.record_cursor是一个引用游标类型。引用游标只在创建它的数据库中有效,是一种内存句柄。换句话说,你不能在远程数据库中创建引用游标并尝试从本地数据库中获取数据。

如果你确实需要在本地数据库中处理数据,并且表必须保留在远程数据库中,那么你可以将“package_name”包移动到本地数据库中,并通过数据库链接执行查询来访问远程数据库中的表。


1
这对我来说很有意义。但是(请原谅我的无知),当通过jdbc链接返回时,ref游标是如何工作的?在这种情况下,它不是在不同的内存空间中使用吗?谢谢。 - neesh
1
一个应用程序通过jdbc连接访问数据库。你的应用程序确实可以从存储过程中获取一个ref cursor。但是你不会在本地/应用程序端使用那个ref cursor。相反,你会将ref cursor交回给数据库进行提取操作。你基本上告诉数据库“给我与这里的句柄相关联的结果集”。 - Juergen Hartelt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接