我试图通过数据库链接调用存储过程。代码看起来像这样:
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;
关于另一个问题,我记得package_name.record_cursor是引用游标类型。ref游标是仅在创建它的数据库中有效的内存句柄。换句话说,您不能在远程数据库中创建ref游标并尝试从中获取本地数据库。
如果您确实需要处理本地数据库中的数据,并且表必须保留在远程数据库中,则可以将包“ package_name”移动到本地数据库中,并通过以下方式对远程数据库中的表执行查询:数据库链接。