`

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

阅读更多

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

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

 

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

分享到:
评论

相关推荐

    数据库存储过程编写 参考手册

    7. 事务处理:事务是一组不可分割的工作单元,是数据库操作的最小单位。事务处理保证了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。手册中讲解了简单的正常提交-异常回滚操作、自治事务、以及多用户间...

    如何在Java程序中访问mysql数据库中的数据并进行简单的操作

    在Java程序中访问MySQL数据库并进行简单操作,主要涉及到Java的JDBC(Java Database Connectivity)技术,这是一种标准的API,允许Java程序与各种类型的数据库进行交互。以下将详细阐述整个过程: 1. **加载JDBC...

    数据库系统概论课,包含PPT课件、复习题、基本术语等资料,我已考过,欢迎大家下载观看,通过考试

    通过深入学习这些材料,考生不仅可以对数据库系统有全面的理解,还能为考试做好充分准备。这些资源的分享显示了学习者对知识传播的热情,希望对所有使用这些资料的人有所帮助,助力他们顺利通过考试。

    PLSQL基础(中文版)

    **PL/SQL基础(中文版)** ...总之,PL/SQL是Oracle数据库开发的关键工具,通过学习和实践,你可以创建高效、可靠的数据库应用程序。提供的"PLSQL.pdf"文档将详细解释这些概念,并提供实例帮助你深入理解。

    BH_US_08_Clark_SQL_Injection_for_Fun_Profit

    文档中展示了一段SQL代码示例,通过声明变量和游标,遍历数据库表结构,动态生成并执行更新语句,将恶意字符串插入到各个表的字段中。这种技术允许攻击者修改数据库中的任何文本数据,从而实现远程代码执行、数据...

    PLSQL程序设计

    PL/SQL代码集成于Oracle数据库服务器中,使得数据处理既快速又高效,并且它也能在Oracle数据库的一些客户端工具中使用。 PL/SQL的优点在于它结合了传统编程语言的强大功能和SQL语言的灵活性,支持过程化编程和面向...

    PL/SQL学习笔记

    函数可以嵌入在SQL语句中使用,而存储过程不能。函数的基本操作包括创建、调用、声明和参数的使用。 包(Package)是PL/SQL中的模块化结构,用来封装过程、函数、变量、常量和异常等。包分为两个部分:包规范...

    Oracle PL/SQL语言初级教程

    6. **Oracle数据库游标使用大全** - 游标用于逐行处理查询结果,可以动态处理数据,实现循环和条件判断。 - 记录变量用于存储游标当前行的数据,便于处理和操作。 - 游标FOR循环简化了游标处理,自动遍历结果集,...

    oracle 学习电子书

    8. **Ajax**: 使网页能在不刷新整个页面的情况下与服务器交换数据,通常涉及与后台数据库的交互。 虽然这些文件不是Oracle数据库的直接教程,但它们提供了Web开发的背景知识,这对于构建与Oracle数据库交互的Web...

    python连接mssql包

    首先,`pyodbc`是一个Python接口,它允许我们通过ODBC(Open Database Connectivity)与各种数据库系统进行交互,包括MSSQL。安装`pyodbc`可以使用pip命令: ```bash pip install pyodbc ``` 连接MSSQL的基本步骤...

    PLSQL_Oracle 编程讲义

    它们必须遵循特定的规则,例如不能使用Oracle关键字作为标识符名称。 **2.3 变量类型** PL/SQL支持多种变量类型,包括基本类型(如NUMBER、VARCHAR2等)和复合类型(如记录和表)。其中: - **基本类型**:用于...

    PL/SQL编程

    2. **通过应用程序**: 例如Web应用程序或者桌面应用程序,这些程序可以通过调用存储在数据库中的PL/SQL函数或过程来间接执行PL/SQL代码。 ### 第二章 PL/SQL块结构和组成元素 #### 2.1 PL/SQL块 PL/SQL的基本单位...

    Oracle_PLSQL

    ### Oracle PL/SQL知识点详解 #### 一、PL/SQL概览 **1.1 什么是PL/SQL?** PL/SQL(Procedural Language for SQL)是Oracle为...掌握PL/SQL不仅能够提升数据库应用程序的性能,还能增强数据处理的安全性和可靠性。

    PLSQL Program Design

    通过对PL/SQL的学习,开发者可以更加高效地管理和操作Oracle数据库中的数据,同时也能更好地利用数据库的功能和资源。以上是对PL/SQL程序设计中几个关键知识点的详细介绍,希望能帮助读者深入理解这一重要的数据库...

    2021-2022计算机二级等级考试试题及答案No.12720.docx

    - **列表框**与**组合框**:列表框只能从预定义的列表中选择项目,而不能输入新值;组合框则允许用户输入新值或从列表中选择。 ### 8. 逻辑表达式的应用 - **判断奇偶数**:在编程中,可以通过`x Mod 2 = 1 And y ...

Global site tag (gtag.js) - Google Analytics