2009-07-13 65 views
4

我想通过数据库链接调用存储过程。该代码看起来是这样的:通过dblink调用存储过程

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 [email protected]_link_name; 
     symbol_record [email protected]_link_name; 
begin 
     symbol_cursor := [email protected]_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; 
+0

Duplicate http://stackoverflow.com/questions/1119306/execute-immediate-over-databse-link – skaffman 2009-07-13 21:29:54

+0

我不同意这是一个重复的问题,这是关于执行*动态*代码一个dblink。 – 2009-07-13 22:04:38

回答

4

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

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