li
  当前位置:主页 > 性能优化 > 文章内容
li
能否通过数据库链传播游标
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:4  

在处理页面的查询时,经常使用的一种方法是,在数据库服务器上的存储过程打开游标,然后将游标直接返回给页面处理的程序。

今天同事在处理游标的时候提出一个问题:是否可以将游标传给另一台数据库服务器的存储过程呢?


首先看个最简单的例子,用游标将结果集返回给SQLPLUS客户端:

SQL> CONN TEST/TEST@TEST2已连接。
SQL> CREATE TABLE TEST AS SELECT ROWNUM ID, TABLE_NAME NAME FROM ALL_TABLES WHERE OWNER = 'SYSTEM';

表已创建。

SQL> CREATE OR REPLACE PACKAGE PKG_TEST AS
2 TYPE C_CURSOR IS REF CURSOR;
3 END;
4 /

程序包已创建。

SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_CURSOR OUT PKG_TEST.C_CURSOR) AS
2 BEGIN
3 OPEN P_CURSOR FOR SELECT * FROM TEST;
4 END;
5 /

过程已创建。

SQL> VAR CUR REFCURSOR
SQL> EXEC P_TEST(:CUR)

PL/SQL 过程已成功完成。

SQL> PRINT :CUR

ID NAME
---------- ------------------------------
1 DEF$_TEMP$LOB
2 HELP
3 MVIEW$_ADV_INDEX
4 MVIEW$_ADV_OWB
5 MVIEW$_ADV_PARTITION

下面尝试在其他数据库中接收这个游标变量:

SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';

数据库链接已创建。

SQL> VAR CUR2 REFCURSOR
SQL> EXEC P_TEST@TEST2(:CUR2)

PL/SQL 过程已成功完成。

SQL> PRINT :CUR2
ERROR:
ORA-24338:
未执行语句句柄

未选定行

对于这种希望从远端数据库得到游标只能通过下面的变相的方式获得:

SQL> CREATE OR REPLACE PACKAGE PKG_TEST AS
2 TYPE C_CURSOR IS REF CURSOR;
3 END;
4 /

程序包已创建。

SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_CURSOR OUT PKG_TEST.C_CURSOR) AS

www.ixdba.net


2 BEGIN
3 OPEN P_CURSOR FOR SELECT * FROM TEST@TEST2;
4 END;
5 /

过程已创建。

SQL> EXEC P_TEST(:CUR2)

PL/SQL 过程已成功完成。

SQL> PRINT :CUR2

ID NAME
---------- ------------------------------
1 DEF$_TEMP$LOB
2 HELP
3 MVIEW$_ADV_INDEX
4 MVIEW$_ADV_OWB
5 MVIEW$_ADV_PARTITION

把获取远端数据库的游标修改为打开一个从远端数据库表取数据的本地游标。

根据游标的定义,游标应该是Oracle为了处理SQL语句而申请的一块内容区域。而传递游标实际上就是传递的内存的指针。将一个数据库中的游标传递到另一个数据库中,在A数据库中指向一个执行固定结果集的游标,在B数据库中可能指向的就是未分配的内存区域。因此,在数据库之间传递游标显然是不可行的。




  上一篇: 数据库链的USING语句   下一篇: 远端数据库读取插入到另一个远端...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·数据库链的USING语句
·通过数据库链访问当前库
·访问本地物化视图一定比访问远端...
·如何从远端返回LOB对象
·使用数据库链的几个小技巧
·通过数据库链执行DDL语句
·一个同义词可能指向多个对象
·JOB自动执行出错,但手工执行正常...
·Redhat AS4 for x86_64上安装Ora...
·物化视图的快速刷新(二)
·远端数据库读取插入到另一个远端...
·远端数据库读取插入到另一个远端...
·调整本地时间的小bug
·PUBLIC数据库链无法删除的问题(...
·数据库链与同义词
·ORA-7445(qxuagtag)错误
·对远端表使用NVL2的bug
·通过数据库链执行TEXT操作的小bu...
·oracle的执行计划居然出错!
·去掉DB_DOMAIN的方法
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接