sql - 通过 dblink 调用存储过程

标签 sql oracle plsql oracle10g ora-24338

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

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 所属的同一个数据库实例和模式运行它时,我能够正常运行它。但是,当我通过数据库链接运行它时(对存储的 proc 名称进行必要的修改等),我收到一个 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;

最佳答案

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

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

关于sql - 通过 dblink 调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122175/

相关文章:

mysql - 在 MYSQL 中将 AM/PM 中的时间转换为午夜后的分钟格式

PHP/MySQL 登录表单

sql - 从一个表查询子/父关系

java - SQL更新挂起Java程序

用于列出数据库中所有模式的 Oracle SQL 查询

php - 在 mysql 中存储 10000 行的 python 字典 - 而不是打印

C# DatagridVIew 删除SQL日期

c# - Dapper 带有 sql 查询动态参数

mysql - 如何在触发器PL/SQL中拆分设置值并插入每一行?

oracle - 如何为缺少的替换参数设置默认值