| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vb >> 数据库 >> 文章正文
使用OLE DB和ADO调用返回记录集的Oracle存储过程            【字体:
使用OLE DB和ADO调用返回记录集的Oracle存储过程
作者:-    文章来源:-    点击数:    更新时间:2007-1-5

摘要  OLE DB是建立在ODBC成功基础上的一种开放规范,它为访问和操纵不同类型数据提供开放的标准。ADO是OLD DB的一个消费者,它提供了对OLE DB数据源应用级的访问功能。在应用程序中使用OLE DB和ADO,可以高效地调用返回记录集的Oracle存储过程。

关键字   OLE DB    ADO     存储过程   记录集

1      前言
    在基于Oracle数据库的ADO应用程序的开发过程中,为了提高执行速度和降低网络流量,往往要在应用程序中调用Oracle数据库服务器端的存储过程。有的存储过程需要返回多行的记录集。这种情况下,在应用程序中调用返回记录集的存储过程存在一定的难度。本文介绍如何使用OLE DB和ADO调用返回记录集的Oracle存储过程。
2       OLE DB和ADO的关系
2.1 OLE DB简介
OLE DB建立在ODBC成功基础上的开放的规范,它为访问和操纵不同类型数据提供开放的标准。OLE DB定义了一个COM接口集合,它封装了各种数据库管理系统服务。这些接口允许创建实现这些服务的软件组件。OLE DB组件包括数据提供者(存储和发布数据)、数据消费者(使用数据)和服务组件(处理和传输数据)。
OLE DB的设计是以消费者和提供者概念为中心。OLE DB消费者表示传统的客户方,提供者将数据以表格形式传递给消费者。OLE DB的Oracle提供者(OraOLEDB)可使OLE DB消费者高效地访问Oracle数据源。图1给出OLE DB的系统图示。OLE DB数据提供者将数据从数据源传递给消费者。在标准接口的基础上,OLE DB消费者能够访问来自提供者的数据。因为有COM组件,消费者可以用任何支持COM的编程语言访问数据。
 
2.2      ADO对象模在ADO对象模型中,Connection、Command和Recordset对象是三个主要的对象。Connection对象表示对远程数据的连接。Connection对象可与Command对象或Recordset对象关联。Command对象定义了对数据源执行的指定命令。Command对象可以用来执行命令和参数化的SQL语句,可以用于SQL语句和返回记录集的SQL查询。Command对象既可以使用一个活动的Connection对象,也可以创建它自己到目标数据源的连接。Command对象包含一个Parameters集合,在该集合中每一个Parameter对象表示Command对象使用的参数。Command对象执行参数化的SQL语句时,每一个Parameter对象表示SQL语句中的一个参数。Recordset对象表示的来自基本表或命令执行结果的记录全集。Recordset对象既可以使用一个活动的Connection对象,也可以创建它自己到目标数据源的连接。Recordset对象允许查询和修改数据。每一个Recordset包含一个Field对象集合,其中,每个Field对象表示Recordset中一个数据列。
2.3      ADO和OLE DB的关系
OLE DB是系统级编程接口,ADO是应用软件级编程接口。ADO是OLE DB的一个消费者,它提供了对OLE DB数据源应用级的访问功能。ADO为OLE DB提供了一个易于使用的应用级接口。ADO允许用户编写通过OLE DB提供者对数据库服务器中的数据进行访问和操作的应用程序。其主要的优点是易于使用、高速度、低内存和占用较少的磁盘空间。ADO和OLE DB的关系如图2所示:
 
3  Oracle中返回记录集的存储过程的定义
    在Oracle存储过程中,通过定义类型为REF CURSOR(游标指针)的传出参数,可以返回记录集。OLE DB允许消费者执行带REF CURSOR类型参数的PL/SQL存储过程,或者执行返回REF CURSOR的存储函数。返回记录集的存储过程或函数必须定义在程序包里。包是Oracle数据库的一种对象,它可以将数据类型、存储过程、函数、变量和常量封装在一起。包在结构上分为包头和包体两部分,这两部分要分别建立。包头用来定义可被外部引用的元素;包体定义实际代码。使用程序包定义返回记录集的存储过程时,需要在包头中预定义自己的REF CURSOR类型。在程序包体中,存储过程或函数须使用预定义的游标类型。另外,在一个存储过程或函数中,可以定义多个REF CURSOR类型的参数以返回多个记录集。
以下以职工表emp为例,介绍如何定义返回记录集的Oracle存储过程,emp表的定义如下:
CREATE TABLE emp(
empno     NUMBER(4) NOT NULL,  --职工编号
ename     VARCHAR2(10),        --职工姓名
hiredate  DATE,                --雇佣日期
sal       NUMBER(7,2),         --工资
deptno    NUMBER(2));         --所属部门编号
下面给出返回记录集的Oracle存储过程和存储函数的示例程序包头和包体,其中存储过程GetEmpRecords含有两个REF CURSOR类型的传出参数,返回两个记录集,存储函数GetDept的返回值类型为REF CURSOR,返回一个记录集。
--定义一个名为Employees的程序包头
CREATE OR REPLACE PACKAGE Employees AS         
  TYPE empcur IS REF CURSOR;                  
  --empcur为自定义REF CURSOR类型
--声明一个存储过程GetEmpRecords
  PROCEDURE GetEmpRecords(p_cursor OUT empcur,
                          q_cursor OUT empcur,
                          indeptno IN NUMBER,
                          p_errorcode OUT NUMBER);
--声明一个存储函数GetDept
  FUNCTION GetDept(inempno IN NUMBER,
                   p_errorcode OUT NUMBER)          
  RETURN empcur;
END Employees; ---程序包头定义结束                                  
--定义Employees的程序包体
--定义存储过程GetEmpRecords
CREATE OR REPLACE PACKAGE BODY Employees AS   PROCEDURE GetEmpRecords(p_cursor OUT empcur,  q_cursor OUT empcur,
              indeptno IN NUMBER, p_errorcode OUT NUMBER) IS 
BEGIN  
  p_errorcode := 0;     -- p_errorcode为错误编号
--打开游标变量p_cursor,查询所属部门编号
--为indeptno的所有职工的信息
  OPEN p_cursor FOR   
    SELECT * FROM emp 
WHERE deptno = indeptno  ORDER BY empno; 
--打开游标变量q_cursor,查询所属部门编号
--为indeptno的所有职工的编号信息
    OPEN q_cursor FOR  
SELECT empno  FROM emp  
WHERE deptno = indeptno   ORDER BY empno;
    EXCEPTION                  --例外处理
      WHEN OTHERS THEN 
      p_errorcode:= SQLCODE; 
 END GetEmpRecords; --存储过程GetEmpRecords定义结束
--定义存储函数GetDept
 FUNCTION GetDept(inempno IN NUMBER, 
                  p_errorcode OUT NUMBER)
 RETURN empcur IS  p_cursor empcur;  --返回值
 BEGIN  
p_errorcode := 0; 
--查询职工编号为inempno的职工的所属部门编号
    OPEN p_cursor FOR 
SELECT deptno  FROM emp WHERE empno = inempno; 
    RETURN (p_cursor); 
    EXCEPTION 
      WHEN OTHERS THEN 
      p_errorcode:= SQLCODE;
 END GetDept;  
END Employees; --程序包体定义结束

[1] [2] [3] [4] [5] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 用VB编写DirectX7.0游戏(下…

  • 用VB编写DirectX7.0游戏(上…

  • 使用VB调用Oracle程序包内的…

  • VB中用ADO对象动态创建数据库…

  • fffff

  • 如何用MSComm Control传Bina…

  • MultiLink的WinSock Server程…

  • 用VB制作浏览器

  • 用VB编写网络寻呼机

  • 制作自己的网络搜索软件

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |