數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第1頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第2頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第3頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第4頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)了解數(shù)據(jù)庫應(yīng)用程序的體系結(jié)構(gòu)與開發(fā)過程;了解ODBC和JDBC數(shù)據(jù)庫連接了解ASP.NET和JSP的Web數(shù)據(jù)庫開發(fā)技術(shù);掌握游標(biāo)、存儲過程、觸發(fā)器的編程方法;能夠使用一種編程語言,實(shí)現(xiàn)數(shù)據(jù)庫應(yīng)用編程。2 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.1 數(shù)據(jù)庫應(yīng)用程序概述1.數(shù)據(jù)庫應(yīng)用系統(tǒng)是由數(shù)據(jù)庫系統(tǒng)、應(yīng)用程序系統(tǒng)和用戶組成,具體包括:數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫管理員、硬件平臺、軟件平臺、應(yīng)用軟件和應(yīng)用界面。2.數(shù)據(jù)庫應(yīng)用程序:一個(gè)通過向DBMS發(fā)出合適的SQL請求語句與數(shù)據(jù)庫進(jìn)行交互的計(jì)算機(jī)應(yīng)用程序。(包括:數(shù)據(jù)庫連接、SQL語句執(zhí)行、數(shù)據(jù)庫返回結(jié)果處理和人機(jī)交互界

2、面)3.數(shù)據(jù)庫應(yīng)用系統(tǒng)從作用范圍的角度可分為三種類型:基于單機(jī)的數(shù)據(jù)庫應(yīng)用系統(tǒng)、基于局域網(wǎng)的客戶-服務(wù)器(C/S)數(shù)據(jù)庫應(yīng)用系統(tǒng)、基于互聯(lián)網(wǎng)的瀏覽器-服務(wù)器(B/S)的數(shù)據(jù)庫應(yīng)用系統(tǒng)。4.數(shù)據(jù)庫應(yīng)用程序的開發(fā)過程包含數(shù)據(jù)庫開發(fā)過程和應(yīng)用軟件開發(fā)過程。3 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué) 7.1.1 數(shù)據(jù)庫應(yīng)用程序結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用程序結(jié)構(gòu)1. 三層架構(gòu)(三層架構(gòu)(3-tier Architecture)所謂三層體系架構(gòu)是在客戶端與數(shù)據(jù)庫之間加入了一個(gè)中間件層,也叫組件層。三層是指邏輯上的三層。三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常來說,客戶端不與數(shù)據(jù)庫直接進(jìn)

3、行交互,而是與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進(jìn)行交互。表現(xiàn)層表現(xiàn)層(UI):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見所得。業(yè)務(wù)邏輯層業(yè)務(wù)邏輯層(BLL):針對具體問題的操作,也可以說是對數(shù)據(jù)層的操作,對數(shù)據(jù)業(yè)務(wù)邏輯處理。數(shù)據(jù)訪問層數(shù)據(jù)訪問層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫,針對數(shù)據(jù)的增加、刪除、修改、查找等。4 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué) 7.1.2 數(shù)據(jù)庫應(yīng)用開發(fā)方法數(shù)據(jù)庫應(yīng)用開發(fā)方法數(shù)據(jù)庫類應(yīng)用程序必須涉及到兩個(gè)方面的內(nèi)容,一方面是使用數(shù)據(jù)庫工具建立庫表,另一方面是使用開發(fā)工具開發(fā)應(yīng)用程序,并通過數(shù)據(jù)庫引擎來訪問對應(yīng)的數(shù)據(jù)庫。因此,需要從數(shù)據(jù)庫開發(fā)生命周

4、期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)和軟件開發(fā)生命周期(軟件開發(fā)生命周期(SDLCSDLC)兩個(gè)方面來把握數(shù)據(jù)庫應(yīng)用程序的開發(fā)過程。1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)數(shù)據(jù)庫開發(fā)生命周期是一個(gè)設(shè)計(jì)、實(shí)現(xiàn)和維護(hù)數(shù)據(jù)庫系統(tǒng)的過程,需要符合組織戰(zhàn)略和操作信息的需求。數(shù)據(jù)庫開發(fā)生命周期與信息系統(tǒng)軟件開發(fā)生命周期是內(nèi)在關(guān)聯(lián)的。DDLC與SDLC是同步進(jìn)行的。2.2.軟件開發(fā)生命周期(軟件開發(fā)生命周期(SDLCSDLC)軟件開發(fā)生命周期是開發(fā)可靠的、可維護(hù)的、高性能的應(yīng)用程序和其他軟件必須遵守的軟件工程框架。軟件過程開始于概念的探討,期間經(jīng)歷一系列軟件開發(fā)過程,結(jié)束于產(chǎn)

5、品的淘汰。5 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)6 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)了解企業(yè)或組織的運(yùn)營狀況,分析信息系統(tǒng)如何幫助解決經(jīng)營過程中存在的問題,然后確定系統(tǒng)需求,完成功能規(guī)格說明書??尚行匝芯亢托枨蠓治錾婕耙韵聝?nèi)容:(1)對現(xiàn)存系統(tǒng)和程序的分析(2)系統(tǒng)的技術(shù)可行性、操作可行性和經(jīng)濟(jì)可行性分析(3)信息需求和業(yè)務(wù)過程分析(4)運(yùn)行環(huán)境和用戶特征分析(5)性能和條件約束分析(6)數(shù)據(jù)項(xiàng)、數(shù)據(jù)量、數(shù)據(jù)存儲和數(shù)據(jù)處理過程分析(7)數(shù)據(jù)屬性和內(nèi)在聯(lián)系(數(shù)據(jù)依賴關(guān)系)分析

6、(8)數(shù)據(jù)操作需求分析(9)數(shù)據(jù)安全需求分析7 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)確定符合組織需求的數(shù)據(jù)庫模型(數(shù)據(jù)庫的概念模型)。功能規(guī)格說明書作為數(shù)據(jù)庫設(shè)計(jì)階段的輸入,進(jìn)行基于選定的DBMS設(shè)計(jì)數(shù)據(jù)庫的邏輯結(jié)構(gòu)和物理結(jié)構(gòu),并完成數(shù)據(jù)庫設(shè)計(jì)規(guī)格說明書。數(shù)據(jù)庫設(shè)計(jì)涉及以下內(nèi)容:(1)概念數(shù)據(jù)庫設(shè)計(jì),包括定義數(shù)據(jù)庫的元素及相互之間的聯(lián)系,定義特定數(shù)據(jù)項(xiàng)的取值約束(2)邏輯數(shù)據(jù)庫設(shè)計(jì)(3)物理數(shù)據(jù)庫設(shè)計(jì)8 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)根據(jù)選定的DBMS,將詳細(xì)的概念模型轉(zhuǎn)化

7、為DBMS的實(shí)現(xiàn)模型。數(shù)據(jù)庫實(shí)現(xiàn)階段涉及的內(nèi)容如下:(1)根據(jù)業(yè)務(wù)需求特點(diǎn)和運(yùn)行環(huán)境進(jìn)行DBMS選型(2)詳細(xì)說明概念的、外部的和內(nèi)部的數(shù)據(jù)定義 (3)概念模型到功能數(shù)據(jù)庫的映射(4)構(gòu)建數(shù)據(jù)字典(5)創(chuàng)建空的數(shù)據(jù)庫文件(6)開發(fā)并實(shí)現(xiàn)應(yīng)用程序軟件(7)用戶培訓(xùn)9 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)加載應(yīng)用數(shù)據(jù),將舊系統(tǒng)切換到新系統(tǒng)10 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周期(DDLCDDLC)測試新的數(shù)據(jù)庫,驗(yàn)證預(yù)期結(jié)果11 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)1.1.數(shù)據(jù)庫開發(fā)生命周期(數(shù)據(jù)庫開發(fā)生命周

8、期(DDLCDDLC)監(jiān)控?cái)?shù)據(jù)內(nèi)容和應(yīng)用程序的發(fā)展和擴(kuò)充,并可能實(shí)施數(shù)據(jù)庫模式的修改或重組12 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué) 2. 2.軟件開發(fā)生命周期(軟件開發(fā)生命周期(DDLCDDLC)1.需要(或概念)階段需要(或概念)階段:研究和精煉概念,同時(shí)確定和分析客戶(用戶或計(jì)劃)的需求。2.規(guī)格說明階段規(guī)格說明階段:將用戶需求寫成規(guī)格說明文檔,闡述軟件產(chǎn)品的預(yù)期功能。3.計(jì)劃階段計(jì)劃階段:草擬軟件項(xiàng)目管理計(jì)劃,細(xì)化軟件開發(fā)的各個(gè)方面。4.設(shè)計(jì)階段設(shè)計(jì)階段:為實(shí)現(xiàn)軟件規(guī)格說明文檔中的功能而經(jīng)歷兩個(gè)連續(xù)的設(shè)計(jì)階段。第一個(gè)階段是概要設(shè)計(jì)階段;第二個(gè)階段是詳細(xì)設(shè)計(jì)階段。這兩個(gè)設(shè)計(jì)階段的文檔描述如何實(shí)現(xiàn)

9、軟件產(chǎn)品。5.編程(編碼或?qū)崿F(xiàn))階段編程(編碼或?qū)崿F(xiàn))階段:用特定的計(jì)算機(jī)編程語言編寫各個(gè)模塊的代碼。6.集成(測試)階段集成(測試)階段:完成模塊的單獨(dú)測試和集成測試,經(jīng)歷Alpha測試和Beta測試。7.維護(hù)階段維護(hù)階段:完成所有維護(hù)工作。當(dāng)增強(qiáng)和更改軟件時(shí),需要更新相應(yīng)的軟件規(guī)格說明文檔。13 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué) 7.1.3 7.1.3 數(shù)據(jù)庫應(yīng)用開發(fā)技術(shù)數(shù)據(jù)庫應(yīng)用開發(fā)技術(shù)近年來,數(shù)據(jù)庫應(yīng)用程序三層架構(gòu)不斷發(fā)展,逐步取代了客戶/服務(wù)器模式。在這種模式下,客戶和數(shù)據(jù)庫服務(wù)器之間增加了一個(gè)應(yīng)用服務(wù)器。原先必須在客戶上實(shí)現(xiàn)的復(fù)雜業(yè)務(wù)邏輯,全部集中到中間件上,完成了客戶端的“減肥”。甚

10、至,客戶端軟件只需要安裝普通的瀏覽器即可。在數(shù)據(jù)庫應(yīng)用開發(fā)過程中,首先需要建立數(shù)據(jù)庫連接,使得應(yīng)用程序能夠與數(shù)據(jù)庫進(jìn)行數(shù)據(jù)訪問操作。常見的數(shù)據(jù)庫連接方式有ODBC、JDBC和ADO等。在Web數(shù)據(jù)庫應(yīng)用中,常見的兩大技術(shù)是ASP(Active Server Pages)技術(shù)和JSP(JavaServer Pages)技術(shù)。ASP是一種使嵌入網(wǎng)頁中的腳本可由Web服務(wù)器執(zhí)行的服務(wù)器端腳本技術(shù),它可以在通過HTTP請求文檔時(shí)再在Web服務(wù)器上動態(tài)創(chuàng)建。JSP是在普通HTML中嵌入了Java程序片段(Scriptlet)和JSP標(biāo)簽的一個(gè)腳本技術(shù)。14 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué) 7.2 7.2

11、數(shù)據(jù)庫連接技術(shù)數(shù)據(jù)庫連接技術(shù)應(yīng)用程序在訪問數(shù)據(jù)庫時(shí),需要與DBMS建立通信連接。但是,不同廠家的DBMS提供不同的數(shù)據(jù)庫訪問應(yīng)用程序接口(Application Programming Interface,API)。因此,需要提供一種統(tǒng)一的數(shù)據(jù)庫通信方式來屏蔽不同廠家的DBMS的API差異性。數(shù)據(jù)庫連接中間件正是這樣一種技術(shù)。本節(jié)主要介紹ODBC、JDBC和嵌入式SQL技術(shù)。(1)ODBC技術(shù)(2)JDBC技術(shù)(3)SQL與宿主語言15 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué) 7.2.1 ODBC 7.2.1 ODBC技術(shù)技術(shù)ODBC(Open Database Connectivity,開放數(shù)據(jù)庫互連

12、)是微軟公司開放服務(wù)結(jié)構(gòu)(WOSA,Windows Open Services Architecture)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分,它建立了一組規(guī)范,并提供了一組對數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)API。這些API利用SQL來完成其大部分任務(wù)。1.ODBC1.ODBC接口接口為了在Windows平臺下提供統(tǒng)一的數(shù)據(jù)庫訪問方式,Microsoft公司于1992年推出了ODBC產(chǎn)品,并提供ODBC API,使應(yīng)用程序與DBMS在邏輯上分離,應(yīng)用程序只需要調(diào)用ODBC API,由ODBC驅(qū)動程序?qū)⒄{(diào)用請求轉(zhuǎn)換為對特定數(shù)據(jù)庫的調(diào)用請求。同一個(gè)應(yīng)用程序就可以訪問不同的數(shù)據(jù)庫系統(tǒng),存取多個(gè)數(shù)據(jù)庫中的數(shù)據(jù),從而提高了應(yīng)用

13、程序的可移植性。與嵌入式SQL相比,ODBC一個(gè)最顯著的優(yōu)點(diǎn)是用它生成的應(yīng)用程序與數(shù)據(jù)庫或數(shù)據(jù)庫引擎無關(guān)。16 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)2.ODBC2.ODBC體系結(jié)構(gòu)體系結(jié)構(gòu)ODBC技術(shù)為應(yīng)用程序提供了一套CLI(Call-Level Interface,調(diào)用層接口)函數(shù)庫和基于DLL(Dynamic Link Library,動態(tài)鏈接庫)的運(yùn)行支持環(huán)境。使用ODBC開發(fā)數(shù)據(jù)庫應(yīng)用程序時(shí),在應(yīng)用程序中調(diào)用標(biāo)準(zhǔn)的ODBC函數(shù)和SQL語句,通過可加載的驅(qū)動程序?qū)⑦壿嫿Y(jié)構(gòu)映射到具體的DBMS或者應(yīng)用系統(tǒng)所使用的系統(tǒng)中。ODBC是一個(gè)分層的體系結(jié)構(gòu),這樣可保證其標(biāo)準(zhǔn)性和開放性,一個(gè)完整的ODBC

14、由下列幾個(gè)部件組成:用宿主語言和ODBC函數(shù)編寫的應(yīng)用程序用于訪問數(shù)據(jù)庫。其主要任務(wù)是管理安裝ODBC驅(qū)動程序和管理數(shù)據(jù)源應(yīng)用程序要訪問一個(gè)數(shù)據(jù)庫,首先必須用ODBC管理器注冊一個(gè)數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫位置、數(shù)據(jù)庫類型及ODBC驅(qū)動程序等信息,建立起ODBC與具體數(shù)據(jù)庫的聯(lián)系。只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫的連接。這樣,應(yīng)用程序就可以通過驅(qū)動程序管理器與數(shù)據(jù)庫交換信息。驅(qū)動程序管理器負(fù)責(zé)將應(yīng)用程序?qū)DBC API的調(diào)用傳遞給正確的驅(qū)動程序,而驅(qū)動程序在執(zhí)行完相應(yīng)的操作后,將結(jié)果通過驅(qū)動程序管理器返回給應(yīng)用程序驅(qū)動程序是實(shí)現(xiàn)ODBC函數(shù)和數(shù)據(jù)

15、源交互的DLL,提供了ODBC和數(shù)據(jù)庫之間的接口。當(dāng)應(yīng)用程序調(diào)用SQL Connect或者SQL Driver Connect函數(shù)時(shí),驅(qū)動程序管理器裝入相應(yīng)的驅(qū)動程序是驅(qū)動程序與DBMS連接的橋梁,數(shù)據(jù)源不是DBMS,而是用于表達(dá)一個(gè)ODBC驅(qū)動程序和DBMS特殊連接的命名。在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、連接的數(shù)據(jù)庫名等,可以將數(shù)據(jù)源名看成是與一個(gè)具體數(shù)據(jù)庫建立的連接。創(chuàng)建數(shù)據(jù)源最簡單的方法是使用Windows的ODBC驅(qū)動程序管理器17 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.2.2 JDBC7.2.2 JDBC技術(shù)技術(shù)JDBC(Java Data Base Connectivity,

16、Java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。有了JDBC API,就不必為訪問Sybase數(shù)據(jù)庫專門寫一個(gè)程序,為訪問Oracle數(shù)據(jù)庫又專門寫一個(gè)程序,或?yàn)樵L問SQL Server數(shù)據(jù)庫又編寫另一個(gè)程序等。作為API,JDBC為程序開發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫廠商及第三方中間件廠商實(shí)現(xiàn)與數(shù)據(jù)庫的連接提供了標(biāo)準(zhǔn)方法。JDBC使用已有的SQL標(biāo)準(zhǔn)并支持與其他數(shù)據(jù)庫連接標(biāo)準(zhǔn),如ODBC之間的橋接。JDBC實(shí)現(xiàn)了所有這些面向標(biāo)準(zhǔn)的目標(biāo)并且具有簡單、嚴(yán)格類型定義且高性能實(shí)現(xiàn)的接口。JDBC實(shí)際上做了3件事

17、:建立與數(shù)據(jù)庫的連接建立與數(shù)據(jù)庫的連接、發(fā)送發(fā)送SQLSQL、處理結(jié)果處理結(jié)果18 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.2.2 JDBC7.2.2 JDBC技術(shù)技術(shù)【例例7-17-1】 給定數(shù)據(jù)庫URL、用戶名和密碼,通過Driver Manager建立數(shù)據(jù)庫連接,創(chuàng)建Statement對象,該對象用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果,對得到的結(jié)果集進(jìn)行遍歷并打印結(jié)果。/ 建立連接Connection con = DriverManager.getConnection( jdbc:odbc:wombat,login,password );/ 發(fā)送SQLStatement stmt = co

18、n.createStatement();ResultSet rs = stmt.executeQuery( SELECT DeptNo,DeptName,Manager FROM Dept );/ 結(jié)果處理While ( rs.next() String deptNo = rs. getString (DeptNo);String deptName = rs.getString(DeptName);String manager = rs. getString (Manager);System.out.println(deptNo+deptName+manager);19 數(shù)據(jù)庫原理及應(yīng)用電子科

19、技大學(xué)7.2.3 SQL7.2.3 SQL與宿主語言與宿主語言SQL語言可以獨(dú)立使用,稱為交互式(Interactive SQL,ISQL)。但I(xiàn)SQL的功能僅限于數(shù)據(jù)庫上操作,缺少數(shù)據(jù)處理能力。而一個(gè)應(yīng)用程序既要訪問數(shù)據(jù),又要處理數(shù)據(jù),把SQL嵌入到程序設(shè)計(jì)語言,如C,C+,Java等,即宿主語言中,將兩者的功能相結(jié)合起來,是目前解決這個(gè)問題的實(shí)現(xiàn)途徑。這樣使用的SQL稱為嵌入式SQL(Embedded SQL,ESQL)。 (1)ESQL (1)ESQL的處理過程的處理過程 (2) ESQL (2) ESQL與主語言之間的通信與主語言之間的通信 (4) ESQL (4) ESQL的使用技術(shù)

20、的使用技術(shù) (3)ESQL (3)ESQL的使用規(guī)定的使用規(guī)定20 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.2.3 SQL7.2.3 SQL與宿主語言與宿主語言(1)ESQL(1)ESQL的處理過程的處理過程 嵌入式SQL是一個(gè)語句級接口,通過程序訪問的數(shù)據(jù)庫模式必須在編寫程序時(shí)已知,以便構(gòu)造SQL語句。例如,程序員必須知道數(shù)據(jù)表名稱、列名稱及它的域。對于嵌入式SQL,RDBMS一般采用預(yù)編譯方法處理,即由RDBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識別出ESQL語句,把它們轉(zhuǎn)換成主語言調(diào)用語句,以使主語言編譯程序能識別它們,然后由主語言的編譯程序?qū)⒓兊闹髡Z言編譯成目標(biāo)碼。21 數(shù)據(jù)庫原理及應(yīng)用電子科技大

21、學(xué)7.2.3 SQL7.2.3 SQL與宿主語言與宿主語言(2)(2) ESQLESQL與主語言之間的通信與主語言之間的通信 將SQL嵌入到高級語言中混合編程,SQL語句負(fù)責(zé)操縱數(shù)據(jù)庫,高級語言語句負(fù)責(zé)控制流程。這時(shí)程序中會含有兩種不同的計(jì)算模型的語句,從而需要二者之間建立通信。數(shù)據(jù)庫工作單元與源程序工作單元之間的通信主要包括:(1)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息,使主語言能夠根據(jù)此信息控制程序流 程,主要用SQL通信區(qū)實(shí)現(xiàn)(2)主語言向SQL語句提供參數(shù),主要用主變量實(shí)現(xiàn)(3)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交給主語言處理,主要用主變量和游標(biāo)實(shí)現(xiàn)22 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.2.3

22、 SQL7.2.3 SQL與宿主語言與宿主語言( (3 3) ) ESQLESQL的使用規(guī)定的使用規(guī)定 為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定: 1 1. .在程序中要區(qū)分在程序中要區(qū)分SQLSQL語句和宿主語言語句語句和宿主語言語句在ESQL中,為了能夠區(qū)分SQL語句與宿主語言語句,所有的SQL語句都必須加前綴標(biāo)識“EXEC SQL”,并以“END_EXEC”作為語句的結(jié)束標(biāo)志。嵌入式SQL語句的格式如:EXEC SQL END_EXEC結(jié)束標(biāo)志在不同的宿主語言中可能是不同的,在C和PASCAL語言程序中規(guī)定結(jié)束標(biāo)志為“;”,而不是“END_EXEC”。23 數(shù)據(jù)庫原理

23、及應(yīng)用電子科技大學(xué)7.2.3 SQL7.2.3 SQL與宿主語言與宿主語言( (3 3) ) ESQLESQL的使用規(guī)定的使用規(guī)定 為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:2 2. SQL. SQL的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語句如下:1)游標(biāo)定義語句(DECLARE)。游標(biāo)是與某一查詢結(jié)果相聯(lián)系的符號名,游標(biāo)用SQL的DECLARE語句定義,其格式如

24、下:EXEC SQL DECLARE CURSOR FOREND EXEC游標(biāo)定義語句是一個(gè)說明語句,定義中的SELECT并不立即執(zhí)行。24 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.2.3 SQL7.2.3 SQL與宿主語言與宿主語言( (3 3) ) ESQLESQL的使用規(guī)定的使用規(guī)定 為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:2 2. SQL. SQL的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理

25、方式。與游標(biāo)有關(guān)的SQL語句如下:2)游標(biāo)打開語句(OPEN)。該語句在執(zhí)行游標(biāo)定義中的SELECT語句,同時(shí)游標(biāo)處于活動狀態(tài)。游標(biāo)是一個(gè)指針,此時(shí)指向查詢結(jié)果的第一行之前。OPEN語句的格式如下:EXEC SQL OPEN END_EXEC25 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.2.3 SQL7.2.3 SQL與宿主語言與宿主語言( (3 3) ) ESQLESQL的使用規(guī)定的使用規(guī)定 為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:2 2. SQL. SQL的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄

26、集合,而宿主語言語句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語句如下:3)游標(biāo)推進(jìn)語句(FETCH)。此時(shí)游標(biāo)推進(jìn)一行,并把游標(biāo)指向的行(即當(dāng)前行)中的值取出并送到共享變量,其格式如下:EXEC SQL FETCH FROM INTO END_EXEC變量表由逗號分開的共享變量組成。FETCH語句通常置于宿主語言程序的循環(huán)結(jié)構(gòu)中,并借助宿主語言的處理語句逐一處理查詢結(jié)果中的每一個(gè)元組。26 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3 WEB7.3 WEB數(shù)據(jù)庫系統(tǒng)技術(shù)數(shù)據(jù)庫系統(tǒng)技術(shù) Web數(shù)據(jù)庫管理系統(tǒng)是指基于Web模式的DBMS的

27、信息服務(wù),充分發(fā)揮DBMS高效的數(shù)據(jù)存儲和管理能力,以Web這種瀏覽器/服務(wù)器(B/S)模式為平臺,將客戶端融入統(tǒng)一的Web瀏覽器,為Internet用戶提供使用簡便、內(nèi)容豐富的服務(wù)。Web數(shù)據(jù)庫管理系統(tǒng)必將成為Internet和Intranet提供的核心服務(wù),為Internet上的電子商務(wù)提供技術(shù)支持。WebWeb數(shù)據(jù)庫處理環(huán)境數(shù)據(jù)庫處理環(huán)境27 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.1 ASP.NET7.3.1 ASP.NET技術(shù)技術(shù) ASP.NET是微軟公司的.NET FrameWork的一部分。它是一個(gè)開發(fā)框架,用于通過 HTML、CSS、JavaScript 以及服務(wù)器腳本來構(gòu)建網(wǎng)頁和

28、網(wǎng)站。與直接由Web服務(wù)器提供的靜態(tài)HTML不同的是,ASP.NET頁面實(shí)際上是在服務(wù)器上執(zhí)行以后再產(chǎn)生結(jié)果的。ASP.NETASP.NET的體系結(jié)構(gòu)的體系結(jié)構(gòu)28 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.1 ASP.NET7.3.1 ASP.NET技術(shù)技術(shù) 所有 Web 客戶端都通過 Internet 信息服務(wù)(IIS) 與 ASP.NET 應(yīng)用程序進(jìn)行通訊。IIS 解釋請求并且有選擇地對請求進(jìn)行身份驗(yàn)證。如果將“允許匿名”設(shè)置為 true,則不會進(jìn)行身份驗(yàn)證。IIS 也會查找所請求的資源(如 ASP.NET 應(yīng)用程序),如果客戶端得到了授權(quán),則會返回相應(yīng)的資源。ASP.NETASP.NET的體

29、系結(jié)構(gòu)的體系結(jié)構(gòu)29 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.1 ASP.NET7.3.1 ASP.NET技術(shù)技術(shù)ASP.NET是ASP和.NET相結(jié)合的產(chǎn)物,它與.NET框架緊密集成,可以利用.NET提供的新功能來創(chuàng)建動態(tài)Web頁面,其中包含了許多新的特性:(1 1)代碼編譯執(zhí)行)代碼編譯執(zhí)行(2 2)靈活性)靈活性(3 3)簡易性)簡易性(4 4)可管理性)可管理性(5 5)安全性)安全性影響ASP性能的一個(gè)重要的原因就是它是基于腳本(VBScript 或 JavaScript)的。腳本語言有兩大缺陷:它們是解釋型的并且分類不嚴(yán)格,從而導(dǎo)致執(zhí)行速度慢、效率低。與解釋語言不同,ASP.NET可利

30、用早期綁定、實(shí)時(shí)編譯、本機(jī)優(yōu)化等服務(wù),即便代碼是腳本語言,它也會在執(zhí)行前被編譯,因此Javascript代碼頁面的性能也會得到提高。由于ASP.NET基于公共語言運(yùn)行庫,因此Web應(yīng)用程序開發(fā)人員可以利用整個(gè)平臺的威力和靈活性。.NET框架類庫、消息處理和數(shù)據(jù)訪問解決方案都可以從Web中無縫訪問。此外,開發(fā)ASP.NET也與語言無關(guān),所以可以選擇最適合應(yīng)用程序的語言,或跨多種語言來分割應(yīng)用程序進(jìn)行開發(fā)。在集成的.NET框架中,ASP.NET可以非常方便地開發(fā)Web應(yīng)用程序和XML Web服務(wù),同時(shí)站點(diǎn)的配置、發(fā)布也非常方便。對于簡單的ASP應(yīng)用程序,配置其實(shí)并不復(fù)雜,但是當(dāng)程序移植到一個(gè)利用組

31、件的N層機(jī)構(gòu)中時(shí)就會遇到問題。當(dāng)對這些應(yīng)用程序進(jìn)行配置和維護(hù)時(shí),DLL陷阱問題就會出現(xiàn)。ASP.NET中取消了組件注冊以及DLL鎖定,全面使用了XML配置文件,從而解決了這個(gè)問題。作為.NET框架的一部分,ASP.NET提供了很多高級安全功能,包括實(shí)現(xiàn)身份驗(yàn)證和授權(quán)解決方案的機(jī)制、對角色和身份標(biāo)識的支持,可以實(shí)現(xiàn)自定義身份驗(yàn)證和授權(quán)的架構(gòu),與微軟的.NET Passport集成,確保代碼訪問安全。30 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.2 JSP7.3.2 JSP技術(shù)技術(shù) JSP(JavaServer Pages)是在普通HTML中嵌入了Java程序片段(Scriptlet)和JSP標(biāo)簽的一

32、個(gè)腳本。JSP網(wǎng)頁Java程序片段可以操縱數(shù)據(jù)庫、重新定向網(wǎng)頁以及發(fā)送E-mail等,實(shí)現(xiàn)建立動態(tài)網(wǎng)站所需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅是得到的結(jié)果,這樣大大降低了對客戶瀏覽器的要求,即使客戶瀏覽器端不支持Java,也可以訪問JSP網(wǎng)頁。31 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.2 JSP7.3.2 JSP技術(shù)技術(shù) 1.JSP1.JSP的工作原理的工作原理32 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.2 JSP7.3.2 JSP技術(shù)技術(shù)3.JSP3.JSP的內(nèi)置對象的內(nèi)置對象(1)Request對象(2)Response對象(3)Session對象(4)Aplica

33、tion對象(5)Out對象(6)Cookie對象該對象封裝了用戶提交的信息,通過調(diào)用該對象相應(yīng)的方法可以獲取封裝的信息,即使用該對象可以獲取用戶提交信息。Response對象對客戶的請求做出動態(tài)的響應(yīng),向客戶端發(fā)送數(shù)據(jù)。Session對象是一個(gè)JSP內(nèi)置對象,它在第一個(gè)JSP頁面被裝載時(shí)自動創(chuàng)建,完成會話期管理。服務(wù)器啟動后就產(chǎn)生了Application對象,當(dāng)客戶再所訪問的網(wǎng)站的各個(gè)頁面之間瀏覽時(shí),這個(gè)Application對象都是同一個(gè),直到服務(wù)器關(guān)閉。但是與Session不同的是,所有客戶的Application對象都是同一個(gè),即所有客戶共享這個(gè)內(nèi)置的Application對象。Out

34、對象是一個(gè)輸出流,用來向客戶端輸出數(shù)據(jù)。Cookie是Web服務(wù)器保存在用戶硬盤上的一段文本。Cookie允許一個(gè)Web站點(diǎn)在用戶的電腦上保存信息并且隨后再取回它。Cookie是以“關(guān)鍵字key=值value“的格式來保存紀(jì)錄的。33 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.2 JSP7.3.2 JSP技術(shù)技術(shù) 4.JSP4.JSP的簡單例子的簡單例子【例7-3】通過new Date() 顯示當(dāng)前日期和時(shí)間,創(chuàng)建JSP文件,其內(nèi)容如下:保存為example.jsp,并發(fā)布于Tomcat服務(wù)器,該JSP文件將被編譯成Servlet。First PageHello, today is: 例7-3在To

35、mcat服務(wù)器上運(yùn)行的結(jié)果34 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.3.2 JSP7.3.2 JSP技術(shù)技術(shù) 5.JSP5.JSP通過通過JDBCJDBC連接數(shù)據(jù)庫連接數(shù)據(jù)庫(1)獲取數(shù)據(jù)庫連接(2)執(zhí)行SQL語句(3 3)處理執(zhí)行結(jié)果)處理執(zhí)行結(jié)果 (4 4)釋放連接)釋放連接用DriverManager獲取數(shù)據(jù)庫連接,如SQL Server數(shù)據(jù)庫的連接:/ SQL Server 的JDBC驅(qū)動程序名稱String driverName = com.microsoft.sqlserver.jdbc.SQLServerDriver; /名為Teaching數(shù)據(jù)庫的SQL Server連接字符串St

36、ring url = jdbc:sqlserver:/localhost:1433; DatabaseName=Teaching; String userName = sa; /用戶名String userPwd = sa; /密碼Class.forName(driverName);Connection conn= DriverManager.getConnection(url, userName, userPwd);可以采用Statement或PreparedStatement來執(zhí)行SQL語句,如:String sql;Statement stmt = conn.createStatemen

37、t();ResultSet rs = stmt.executeQuery(sql); / 執(zhí)行數(shù)據(jù)查詢語句(select)stmt.executeUpdate(sql); / 執(zhí)行數(shù)據(jù)更新語句(delete、update、insert、drop等)stmt.close(); 遍歷訪問結(jié)果集的形式如:while (rs.next() System.out.println(第一個(gè)字段值為: + rs.getString(1);System.out.println(姓名為: + rs.getString(“姓名”);一般地,先關(guān)閉ResultSet,然后關(guān)閉Statement(或者PreparedS

38、tatement),最后關(guān)閉Connection。連接關(guān)閉如下:rs.close(); /關(guān)閉ResultSetstmt.close(); /關(guān)閉Statementconn.close(); /關(guān)閉Connection35 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.4 7.4 游標(biāo)編程游標(biāo)編程 DBMS通過游標(biāo)(游標(biāo)(CursorCursor)提供了一種從記錄集中逐一訪問記錄的靈活手段。就本質(zhì)而言,游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提就本質(zhì)而言,游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條取一條記錄的機(jī)制。游標(biāo)總是與一條SQLSQL選擇語句(選擇語

39、句(SelectSelect)相關(guān)聯(lián)。)相關(guān)聯(lián)。SQL ServerSQL Server支持三種類型的游標(biāo):支持三種類型的游標(biāo):Transact_SQLTransact_SQL游標(biāo),游標(biāo),APIAPI服務(wù)器游標(biāo)和客服務(wù)器游標(biāo)和客戶游標(biāo)。戶游標(biāo)。36 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.4 7.4 游標(biāo)編程游標(biāo)編程 (1 1)Transact_SQLTransact_SQL游標(biāo)游標(biāo)Transact_SQLTransact_SQL游標(biāo)是由游標(biāo)是由DECLARE CURSORDECLARE CURSOR語法定義,主要用在語法定義,主要用在Transact_SQL Transact_SQL 腳腳本、存儲過

40、程和觸發(fā)器中。本、存儲過程和觸發(fā)器中。Transact_SQL Transact_SQL 游標(biāo)主要用在服務(wù)器上,由從客戶端游標(biāo)主要用在服務(wù)器上,由從客戶端發(fā)送給服務(wù)器的發(fā)送給服務(wù)器的Transact_SQLTransact_SQL語句或是批處理、存儲過程、觸發(fā)器中的語句或是批處理、存儲過程、觸發(fā)器中的Transact_SQLTransact_SQL進(jìn)行管理。進(jìn)行管理。 Transact_SQL Transact_SQL 游標(biāo)不支持提取數(shù)據(jù)塊或多行數(shù)據(jù)。游標(biāo)不支持提取數(shù)據(jù)塊或多行數(shù)據(jù)。(2 2)APIAPI游標(biāo)游標(biāo)API服務(wù)器游標(biāo)支持在OLE DB、ODBC 以及DB_library中使用游標(biāo)函

41、數(shù),主要用在服務(wù)器上。每一次客戶端應(yīng)用程序調(diào)用API 游標(biāo)函數(shù),SQL Server的OLE DB提供者、ODBC驅(qū)動器或DB_library的動態(tài)鏈接庫(DLL)都會將這些客戶請求傳送給服務(wù)器以對API服務(wù)器游標(biāo)進(jìn)行處理。(3 3)客戶游標(biāo))客戶游標(biāo)客戶游標(biāo)主要是當(dāng)在客戶機(jī)上緩存結(jié)果集時(shí)才使用。在客戶游標(biāo)中,有一個(gè)默認(rèn)的結(jié)果集被用來在客戶機(jī)上緩存整個(gè)結(jié)果集??蛻粲螛?biāo)僅支持靜態(tài)游標(biāo)而非動態(tài)游標(biāo)。由于服務(wù)器游標(biāo)并不支持所有的Transact-SQL 語句或批處理,所以客戶游標(biāo)常常僅被用作服務(wù)器游標(biāo)的輔助。因?yàn)樵谝话闱闆r下,服務(wù)器游標(biāo)能支持絕大多數(shù)的游標(biāo)操作。37 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.

42、4.2 7.4.2 游標(biāo)結(jié)構(gòu)游標(biāo)結(jié)構(gòu) 定義一個(gè)游標(biāo)的語法格式如下:定義一個(gè)游標(biāo)的語法格式如下:DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_statement FOR READ ONLY | UPDATE OF column_name ,ncursor_name:游標(biāo)的名字。:游標(biāo)的名字。INSENSITIVE:將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)。對該游標(biāo)的讀取操作皆由臨時(shí)表來:將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)。對該游標(biāo)的讀取操作皆由臨時(shí)表來應(yīng)答。因此,對基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會

43、隨著基本表內(nèi)容的改變而改變,同時(shí)也應(yīng)答。因此,對基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會隨著基本表內(nèi)容的改變而改變,同時(shí)也無法通過游標(biāo)來更新基本表。如果不使用該保留字,那么對基本表的更新、刪除都會反映到游標(biāo)中。無法通過游標(biāo)來更新基本表。如果不使用該保留字,那么對基本表的更新、刪除都會反映到游標(biāo)中。 SCROLL:表明所有的提取操作(如:表明所有的提取操作(如FIRST、LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用該保留字,那么只能進(jìn)行)都可用。如果不使用該保留字,那么只能進(jìn)行NEXT 提取操作。由此可見,提取操作。由此可見,SCROLL

44、極大地增加了提取數(shù)極大地增加了提取數(shù)據(jù)的靈活性,可以隨意讀取結(jié)果集中的任一行數(shù)據(jù)記錄,而不必關(guān)閉再重開游標(biāo)。據(jù)的靈活性,可以隨意讀取結(jié)果集中的任一行數(shù)據(jù)記錄,而不必關(guān)閉再重開游標(biāo)。 select_statement:定義結(jié)果集的定義結(jié)果集的SELECT語句。應(yīng)該注意的是,在游標(biāo)中不能使用語句。應(yīng)該注意的是,在游標(biāo)中不能使用COMPUTE、COMPUTE BY、FOR BROWSE、INTO語句。語句。 READ ONLY:表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新,盡管在默認(rèn)狀態(tài)下游標(biāo)是允許更新的。而且在:表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新,盡管在默認(rèn)狀態(tài)下游標(biāo)是允許更新的。而且在UPDATE或或DELETE語句

45、的語句的WHERE CURRENT OF子句中,不允許對該游標(biāo)進(jìn)行引用。子句中,不允許對該游標(biāo)進(jìn)行引用。 UPDATE OF column_name,n:定義在游標(biāo)中可被修改的列,如果不指出要更新的列,那么所有的列:定義在游標(biāo)中可被修改的列,如果不指出要更新的列,那么所有的列都將被更新。當(dāng)游標(biāo)被成功創(chuàng)建后,游標(biāo)名成為該游標(biāo)的唯一標(biāo)識,也是在以后的存儲過程、觸發(fā)器或都將被更新。當(dāng)游標(biāo)被成功創(chuàng)建后,游標(biāo)名成為該游標(biāo)的唯一標(biāo)識,也是在以后的存儲過程、觸發(fā)器或Transact_SQL 腳本中使用的名字。腳本中使用的名字。38 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.4.3 7.4.3 游標(biāo)編程游標(biāo)編程 每一個(gè)

46、游標(biāo)必須有每一個(gè)游標(biāo)必須有4 4個(gè)組成部分,它們必須符合以下順序:個(gè)組成部分,它們必須符合以下順序:聲明(聲明(DECLAREDECLARE)游標(biāo))游標(biāo)打開(打開(OPENOPEN)游標(biāo))游標(biāo)從一個(gè)游標(biāo)中逐條獲取(從一個(gè)游標(biāo)中逐條獲?。‵ETCHFETCH)并處理記錄信息)并處理記錄信息關(guān)閉(關(guān)閉(CLOSECLOSE)或釋放()或釋放(DEALLOCATEDEALLOCATE)游標(biāo))游標(biāo)游標(biāo)是用于迭代訪問SELECT語句查詢出的結(jié)果集。聲明游標(biāo)就是確定游標(biāo)的屬性,制定游標(biāo)的查詢結(jié)果集。聲明游標(biāo)的語法格式已經(jīng)在上一節(jié)進(jìn)行了描述。打開游標(biāo)語句執(zhí)行游標(biāo)定義中的查詢語句,查詢結(jié)果存放在游標(biāo)緩沖區(qū)中,

47、并使游標(biāo)指針指向游標(biāo)區(qū)中的第一個(gè)元組,作為游標(biāo)的默認(rèn)訪問位置。查詢結(jié)果的內(nèi)容取決于查詢語句的設(shè)置和查詢條件。打開游標(biāo)的語法如下:OPEN 游標(biāo)名稱;讀游標(biāo)區(qū)數(shù)據(jù)語句是讀取游標(biāo)區(qū)中當(dāng)前元組的值,并將各分量依次賦給指定的共享主變量。FETCH語句用于讀取游標(biāo)中的數(shù)據(jù),語句格式為:FETCH NEXT|PRIOR|FIRST|LAST| ABSOLUTE n| RELATIVE n from 游標(biāo)名INTO 局部變量, nNEXTNEXT:表示返回結(jié)果集中當(dāng)前行的下一行記錄,如果第一次讀取則返回第一行。默認(rèn)的讀取選項(xiàng)為NEXT。PRIORPRIOR:表示返回結(jié)果集中當(dāng)前行的前一行記錄,如果第一次讀取

48、則沒有行返回,并且把游標(biāo)置于第一行之前。FIRSTFIRST:表示返回結(jié)果集中的第一行,并且將其作為當(dāng)前行。LASTLAST:表示返回結(jié)果集中的最后一行,并且將其作為當(dāng)前行。ABSOLUTEABSOLUTE n:如果n為正數(shù),則返回從游標(biāo)頭開始的第n行,并且返回行變成新的當(dāng)前行;如果n為負(fù),則返回從游標(biāo)末尾開始的第n行,并且返回行為新的當(dāng)前行;如果n為0,則返回當(dāng)前行。RELATIVERELATIVE n:如果n為正數(shù),則返回從當(dāng)前行開始的第n行;如果n為負(fù),則返回從當(dāng)前行之前的第n行;如果為0,則返回當(dāng)前行。INTOINTO:表示將游標(biāo)當(dāng)前字段值賦值給對應(yīng)的局部變量。在處理完游標(biāo)中數(shù)據(jù)之后必

49、須關(guān)閉游標(biāo)來釋放數(shù)據(jù)結(jié)果集和定位于數(shù)據(jù)記錄上的鎖。CLOSE 語句關(guān)閉游標(biāo),但不釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。如果準(zhǔn)備在隨后的使用中再次打開游標(biāo),則應(yīng)使用CLOSE 命令。關(guān)閉游標(biāo)的語法規(guī)則為:CLOSE GLOBAL cursor_name | cursor_variable_name 游標(biāo)可應(yīng)用在存儲過程、觸發(fā)器和Transact_SQL 腳本中。如果在聲明游標(biāo)與釋放游標(biāo)之間使用了事務(wù)結(jié)構(gòu),則在結(jié)束事務(wù)時(shí)游標(biāo)會自動關(guān)閉。39 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.4.2 7.4.2 游標(biāo)結(jié)構(gòu)游標(biāo)結(jié)構(gòu) (5 5)釋放游標(biāo))釋放游標(biāo)在使用游標(biāo)時(shí),各種針對游標(biāo)的操作或者引用游標(biāo)名,或者引用指向游標(biāo)在使用游標(biāo)

50、時(shí),各種針對游標(biāo)的操作或者引用游標(biāo)名,或者引用指向游標(biāo)的游標(biāo)變量。當(dāng)?shù)挠螛?biāo)變量。當(dāng)CLOSE CLOSE 命令關(guān)閉游標(biāo)時(shí),并沒有釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。命令關(guān)閉游標(biāo)時(shí),并沒有釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。因此常使用因此常使用DEALLOCATE DEALLOCATE 命令。通過該命令可以刪除掉游標(biāo)與游標(biāo)名或游標(biāo)命令。通過該命令可以刪除掉游標(biāo)與游標(biāo)名或游標(biāo)變量之間的聯(lián)系,并且釋放游標(biāo)占用的所有系統(tǒng)資源。其語法規(guī)則為:變量之間的聯(lián)系,并且釋放游標(biāo)占用的所有系統(tǒng)資源。其語法規(guī)則為:DEALLOCATE GLOBAL cursor_name | cursor_variable_name當(dāng)使用當(dāng)使用DEALL

51、OCATE cursor_variable_name DEALLOCATE cursor_variable_name 來刪除游標(biāo)時(shí),游標(biāo)變量并不來刪除游標(biāo)時(shí),游標(biāo)變量并不會被釋放,除非超過使用該游標(biāo)的存儲過程、觸發(fā)器的范圍(即游標(biāo)的作用會被釋放,除非超過使用該游標(biāo)的存儲過程、觸發(fā)器的范圍(即游標(biāo)的作用域)。域)。40 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.5.1 7.5.1 存儲過程的概念存儲過程的概念 存儲過程是一組已被編輯在一起的,存儲在服務(wù)器上的,執(zhí)行某種功能的預(yù)編存儲過程是一組已被編輯在一起的,存儲在服務(wù)器上的,執(zhí)行某種功能的預(yù)編譯譯SQLSQL語句。它是一種封裝重復(fù)任務(wù)操作方法,支持用戶提

52、供的參數(shù)變量,具有語句。它是一種封裝重復(fù)任務(wù)操作方法,支持用戶提供的參數(shù)變量,具有強(qiáng)大的編程能力。強(qiáng)大的編程能力。存儲過程非常類似于存儲過程非常類似于DOSDOS系統(tǒng)中的批處理文件。它將完成某項(xiàng)任務(wù)的許多系統(tǒng)中的批處理文件。它將完成某項(xiàng)任務(wù)的許多SQLSQL語語句寫在一起,組成命令集合的形式,然后通過執(zhí)行該存儲過程就可以完成相應(yīng)的句寫在一起,組成命令集合的形式,然后通過執(zhí)行該存儲過程就可以完成相應(yīng)的任務(wù)。任務(wù)。存儲過程具有許多優(yōu)點(diǎn):存儲過程具有許多優(yōu)點(diǎn):(1 1)加快程序的執(zhí)行速度)加快程序的執(zhí)行速度 (2 2)減少網(wǎng)絡(luò)的數(shù)據(jù)流量)減少網(wǎng)絡(luò)的數(shù)據(jù)流量 (3 3)提供了一種安全機(jī)制)提供了一種安

53、全機(jī)制 (4 4)允許程序模塊化設(shè)計(jì))允許程序模塊化設(shè)計(jì) (5 5)提高編程的靈活性)提高編程的靈活性41 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.5.1 7.5.1 存儲過程的概念存儲過程的概念 在在SQL ServerSQL Server中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時(shí)存儲過程、中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時(shí)存儲過程、遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。(1 1)系統(tǒng)存儲過程)系統(tǒng)存儲過程 以以sp_sp_開頭,用來進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定、取得信息和相關(guān)管理工作。開頭,用來進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定、取得信息和相關(guān)管理工作。(2 2)本地存儲過程)本地存儲

54、過程 用戶創(chuàng)建的存儲過程是由用戶創(chuàng)建并完成某一特定功能的存儲過程,事實(shí)用戶創(chuàng)建的存儲過程是由用戶創(chuàng)建并完成某一特定功能的存儲過程,事實(shí)上一般所說的存儲過程就是指本地存儲過程。上一般所說的存儲過程就是指本地存儲過程。(3 3)臨時(shí)存儲過程)臨時(shí)存儲過程 臨時(shí)存儲過程分為兩種存儲過程:一是本地臨時(shí)存儲過程,以井字號臨時(shí)存儲過程分為兩種存儲過程:一是本地臨時(shí)存儲過程,以井字號(#)(#)作為作為其名稱的第一個(gè)字符,該存儲過程將成為一個(gè)存放在其名稱的第一個(gè)字符,該存儲過程將成為一個(gè)存放在TEMPDBTEMPDB數(shù)據(jù)庫中的本地臨時(shí)存數(shù)據(jù)庫中的本地臨時(shí)存儲過程,且只有創(chuàng)建它的用戶才能執(zhí)行它;二是全局臨時(shí)存

55、儲過程,以兩個(gè)井字號儲過程,且只有創(chuàng)建它的用戶才能執(zhí)行它;二是全局臨時(shí)存儲過程,以兩個(gè)井字號(#)(#)開始,該存儲過程將成為一個(gè)存儲在開始,該存儲過程將成為一個(gè)存儲在TEMPDBTEMPDB數(shù)據(jù)庫中的全局臨時(shí)存儲過程,全數(shù)據(jù)庫中的全局臨時(shí)存儲過程,全局臨時(shí)存儲過程一旦創(chuàng)建,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需局臨時(shí)存儲過程一旦創(chuàng)建,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需要特定的權(quán)限。要特定的權(quán)限。42 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.5.1 7.5.1 存儲過程的概念存儲過程的概念 在在SQL ServerSQL Server中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、

56、臨時(shí)存儲過程、中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時(shí)存儲過程、遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。(4)遠(yuǎn)程存儲過程 在SQL Server中,遠(yuǎn)程存儲過程(Remote Stored Procedures)是位于遠(yuǎn)程服務(wù)器上的存儲過程,通常可以使用分布式查詢和EXECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲過程。(5 5)擴(kuò)展存儲過程)擴(kuò)展存儲過程 擴(kuò)展存儲過程(擴(kuò)展存儲過程(Extended Stored ProceduresExtended Stored Procedures)是用戶可以使用外部程)是用戶可以使用外部程序語言編寫的存儲過程,而且擴(kuò)展存儲過程的名稱通常以序語

57、言編寫的存儲過程,而且擴(kuò)展存儲過程的名稱通常以xp_xp_開頭。開頭。43 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.5.1 7.5.1 存儲過程的概念存儲過程的概念 在在SQL ServerSQL Server中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時(shí)存儲過程、中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時(shí)存儲過程、遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。(4)遠(yuǎn)程存儲過程 在SQL Server中,遠(yuǎn)程存儲過程(Remote Stored Procedures)是位于遠(yuǎn)程服務(wù)器上的存儲過程,通??梢允褂梅植际讲樵兒虴XECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲過程。(5 5)擴(kuò)展存儲過程

58、)擴(kuò)展存儲過程 擴(kuò)展存儲過程(擴(kuò)展存儲過程(Extended Stored ProceduresExtended Stored Procedures)是用戶可以使用外部程)是用戶可以使用外部程序語言編寫的存儲過程,而且擴(kuò)展存儲過程的名稱通常以序語言編寫的存儲過程,而且擴(kuò)展存儲過程的名稱通常以xp_xp_開頭。開頭。44 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.5.2 7.5.2 存儲過程結(jié)構(gòu)存儲過程結(jié)構(gòu) 存儲過程包括過程首部和過程體兩部分,其創(chuàng)建語句的基本格式如下:存儲過程包括過程首部和過程體兩部分,其創(chuàng)建語句的基本格式如下:CREATE PROC EDURE procedure_name ; num

59、ber / /* * 存儲過程首部存儲過程首部*/ parameter data_type VARYING = default OUTPUT ,n WITH RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION FOR REPLICATION AS SQL n / /* * 存儲過程體,描述該存儲過程的操作存儲過程體,描述該存儲過程的操作 */procedure_name:存儲過程名稱:存儲過程名稱 ;number :可選的整數(shù),用來對同名的過程分組:可選的整數(shù),用來對同名的過程分組parameterparameter:參數(shù)列表:參數(shù)列表RECOMPI

60、LE | ENCRYPTION | RECOMPILE, ENCRYPTION:RECOMPILERECOMPILE表明表明SQL Server 不會緩存該過程的計(jì)劃,該過程將在運(yùn)行時(shí)重新編譯。不會緩存該過程的計(jì)劃,該過程將在運(yùn)行時(shí)重新編譯。FOR REPLICATION:指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程。:指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程。45 數(shù)據(jù)庫原理及應(yīng)用電子科技大學(xué)7.5.2 7.5.2 存儲過程結(jié)構(gòu)存儲過程結(jié)構(gòu) 關(guān)于參數(shù)的使用說明如下:每個(gè)存儲過程中最多設(shè)定1024個(gè)參數(shù)用名字來標(biāo)識調(diào)用時(shí)給出的參數(shù)值,必須指定值的參數(shù)類型每個(gè)參數(shù)名前要有一個(gè)“”符號,每

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論