国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

使用OLE DB和ADO調用返回記錄集的Oracle存儲過程

2024-08-29 13:32:20
字體:
來源:轉載
供稿:網友

  摘要 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,返回一個記錄集。

|||,歡迎訪問網頁設計愛好者web開發。--定義一個名為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; --程序包體定義結束

  4 利用ado調用返回記錄集的oracle存儲過程

  使用ole db和ado調用返回記錄集的oracle存儲過程,在定義ado對象和設置參數時,需要特定的設置。

  4.1 設定數據庫連接字符串

  在ado應用程序中,如果要訪問返回記錄集的oracle存儲過程,需要使用oraole db的數據庫連接字符串的指定格式。在連接字符串中,plsqlrset屬性表明oraole db是否需要從pl/sql存儲過程返回記錄集。如果需要返回記錄集,plsqlrset設為1,否則設置為0,默認為 0。在command命令執行后,該屬性需要設置為0。

  4.2 參數的設置

  在ado應用程序中,可以定義調用存儲過程的參數。可使用command對象的createparameter 方法創建parameter 對象,并使用 append 方法將它們添加到 parameters 集合,在調用存儲過程時,parameters 集合將參數傳遞給存儲過程。由于oraole db采用定位傳遞參數的格式,即command對象在調用存儲過程時,調用參數的位置應和存儲過程的參數的位置相對應。根據調用的存儲過程的參數屬性、名稱和位置,在ado中, append 方法添加參數的次序應和存儲過程中參數的順序一致。

  在ole db的標準中,沒有ref cursor類型的預定義數據類型,因此在調用存儲過程時,不能創建ref cursor類型的參數。在ado調用返回記錄集的存儲過程時,ole db自動為存儲過程中ref cursor類型的傳出參數返回記錄集,該記錄集可以賦值給一個recordset對象。如果pl/sql存儲過程有一個或多個ref cursor類型的傳出參數,ole db將這些參數的記錄集集成在一起,并通過第一個ref cursor類型的傳出參數返回,這些記錄集同樣可以賦值給一個recordset對象。

|||

  4.3 調用存儲過程的格式

  調用返回記錄集存儲過程之前,應將command對象的 commandtype 屬性指定sql類型以優化查詢性能,即commandtype 屬性值設為adcmdtext。

  使用 command對象的commandtext 屬性定義調用存儲過程的命令。當使用command對象執行oracle返回記錄集存儲過程時,須以odbc轉義符調用格式來調用存儲過程,例如:{call credit_account(?,?)}。在這種格式中,傳入和傳出參數都用問號“?”來表示。

  4.4返回記錄集

  可使用command對象的 execute 方法調用oracle返回記錄集的存儲過程,并在適當的時候將結果記錄集返回給 recordset對象。該對象可以存儲一個或多個結果記錄集。當存儲多個記錄集時,可以用recordset對象的nextrecordset屬性獲得下一個記錄集。

  下面給出在asp中調用返回存儲過程或函數的示例程序:

<%@ language=vbscript %>
<!--#include file="adovbs.inc"-->
<%
'connection 對象代表了打開的、與數據源的連接。
set con=server.createobject("adodb.connection")
set rst1 =server.createobject("adodb.recordset")
set rst2=server.createobject("adodb.recordset")
set cmd =server.createobject("adodb.command")
set prm1 =server.createobject("adodb.parameter")
set prm2 =server.createobject("adodb.parameter")
con.provider = "oraoledb.oracle" '設置ole db提供者
'設置數據庫連接字符串,test是數據庫網絡服務名
con.connectionstring = "data source=test;" & _
"user id=scott;password=tiger;plsqlrset=1"
'調用返回記錄集的存儲過程,plsqlrset指定為1
con.open
'創建command對象到目標數據源的連接
cmd.activeconnection = con
cmd.commandtype=adcmdtext
'雖然employees.getemprecords()有四個參數,
'但只有需要設定兩個參數
'因為ref cursor參數由ole db連接提供者自動設定。
set prm1 = cmd.createparameter("prm1", adsmallint, adparaminput, , 30) '創建一個輸入參數,對應于indeptno
cmd.parameters.append prm1 '將參數添加到參數集合中
set prm2 = cmd.createparameter("prm2", adsmallint, adparamoutput) '創建一個輸出參數,對應于p_errorcode
cmd.parameters.append prm2
'調用返回記錄集的存儲過程必須使用odbc的轉義符調用格式。
cmd.commandtext = "{call employees.getemprecords(?, ?)}"
'getemprecords存儲過程返回兩個記錄集,獲得第一個記錄集
set rst1 = cmd.execute %>
<table border = 1>
<%
do while (not rst1.eof) %>
<tr>
<% for index=0 to (rst1.fields.count-1) %>
<td valign=top><% = rst1(index)%></td>
<% next %>
</tr>
<% rst1.movenext
loop '顯示第一個記錄集
%>
</table>
<%'獲得getemprecords存儲過程返回的第二個記錄集
set rst2 = rst1.nextrecordset
'在此可加入顯示第二個記錄集的代碼
prm1.value = 7369 '該參數對應于存儲函數的inempno
prm2.value = 0 '該參數對應于存儲函數的p_errorcode
'調用返回記錄集的存儲函數
cmd.commandtext = "{call employees.getdept(?, ?)}"
'獲得getdept存儲函數返回的記錄集
set rst2 = cmd.execute
rst1.close
rst2.close
set rst1=nothing
set rst2=nothing
con.close
set con=nothing
%>
<p> </p>
</body>
</html>

  5 小結

  在應用程序中,使用ole db和ado訪問返回記錄集的存儲過程,ole db服務者可以高效地將數據庫端的多行記錄集返回給ado應用程序。在ado應用程序中,使用command對象可以傳遞輸入或輸出參數給存儲過程,并調用存儲過程以獲得多行記錄集。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山东省| 太原市| 安多县| 永和县| 沽源县| 菏泽市| 建昌县| 共和县| 莱阳市| 彩票| 包头市| 邮箱| 永仁县| 定陶县| 岫岩| 丹巴县| 清镇市| 桑植县| 惠来县| 搜索| 梧州市| 龙陵县| 江西省| 博湖县| 霍邱县| 香河县| 木兰县| 六安市| 甘孜县| 宝丰县| 温州市| 霍州市| 阿拉善左旗| 临泽县| 吴川市| 新巴尔虎左旗| 昭苏县| 新平| 苍山县| 涟源市| 青岛市|