`

能否通过数据库链传播游标

阅读更多

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

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

 

首先看个最简单的例子,用游标将结果集返回给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
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数据库中可能指向的就是未分配的内存区域。因此,在数据库之间传递游标显然是不可行的。

分享到:
评论

相关推荐

    数据库概念的复习总结

    即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。(4)持续性(Durability ):指一个事务一旦提交,它对数据库中数据的改变就应该是永久的。接下来的其他操作或故障...

    Oracle PL/SQL语言初级教程

    8.Oracle数据库游标使用大全 76 其他DML语句 77 DML语句的结果 78 使用游标 79 从游标提取数据 81 记录变量 82 带参数的游标 83 游标FOR循环 84 在游标FOR循环中使用查询 86 游标中的子查询 86 9.PL/SQL异常处理初步...

    oracle学习资料

    §5.2 异常错误传播 13 §5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §...

    Oracle 10g 开发与管理

    (五) 使用游标更新数据库 66 7.9 异常处理 66 (一)预定义异常 66 (二)非预定义异常 67 1.声明异常名 67 2.将异常名与标准的Oracle错误号联系起来 67 3.在Exception中对异常做处理 67 (三) 用户自定义异常 68 3....

    PLSQL基础教程

    目 录 第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 §1.2.1 PL/SQL的好处 4 ...§8.3 删除和使能触发器 13 §8.4 触发器和数据字典 13 §8.5 数据库触发器的应用举例 13

    PLSQL程序设计

    §5.2 异常错误传播 13 §5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §...

    plsql_oracle 编程

    §5.2 异常错误传播 13 §5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §...

    plsql_oracle 8i 编程讲义

    §5.2 异常错误传播 13 §5.2.1 在执行部分引发异常错误 13 §5.2.2 在声明部分引发异常错误 13 §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §...

    Oracle9i的init.ora参数中文说明

    如果要在没有调度程序的情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: 根据操作系统而定。 默认值 :0 mts_sessions: 说明 : 指定允许的共享服务器体系结构用户会话的...

    javaSE代码实例

    10.4.3 不能继承构造器 186 10.4.4 调用兄弟构造器 187 10.5 单列模式 189 10.6 Java程序的加载过程 190 10.7 小结 192 第三篇 高级基础篇 第11章 异常处理——Java世界的医生 195 11.1 异常处理的...

    Linux操作系统基础教程

    我们并不能使同学们通过这次系列讲座成为一个 UNIX 类操作系统的高手,这次系列 讲座的目的就是在同学们中间普及 Linux 基础知识,为今后我们更加接近的了解 Linux 做一 个好的开端。 第一讲 Linux基础 在这一...

Global site tag (gtag.js) - Google Analytics