【问题标题】:calling a stored proc over a dblink通过 dblink 调用存储过程
【发布时间】:2010-11-10 11:11:40
【问题描述】:

我正在尝试通过数据库链接调用存储过程。代码如下所示:

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;

【问题讨论】:

标签: sql oracle plsql oracle10g ora-24338


【解决方案1】:

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

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

【讨论】:

  • 这对我来说很有意义。但是(请原谅我的无知),通过 jdbc 链接返回时,引用游标如何工作?在这种情况下,它不是也用于不同的内存空间吗?谢谢。
  • 应用程序通过 jdbc 连接访问数据库。您的应用程序确实可以从存储过程中获取引用游标。但是您不会在本地/应用程序端使用该引用光标。相反,您会将 ref 游标交还给数据库以进行 fetch 操作。您基本上是告诉数据库“给我与此句柄相关的结果集”。
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2016-10-19
  • 1970-01-01
相关资源
最近更新 更多