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

下載本文檔

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

文檔簡(jiǎn)介

第七章數(shù)據(jù)庫(kù)應(yīng)用編程了解數(shù)據(jù)庫(kù)應(yīng)用程序的體系結(jié)構(gòu)與開發(fā)過(guò)程;了解ODBC和JDBC數(shù)據(jù)庫(kù)連接了解ASP.NET和JSP的Web數(shù)據(jù)庫(kù)開發(fā)技術(shù);掌握游標(biāo)、存儲(chǔ)過(guò)程、觸發(fā)器的編程方法;能夠使用一種編程語(yǔ)言,實(shí)現(xiàn)數(shù)據(jù)庫(kù)應(yīng)用編程?!緦W(xué)習(xí)目標(biāo)】7.1數(shù)據(jù)庫(kù)應(yīng)用程序概述1.數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)是由數(shù)據(jù)庫(kù)系統(tǒng)、應(yīng)用程序系統(tǒng)和用戶組成,具體包括:數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)、數(shù)據(jù)庫(kù)管理員、硬件平臺(tái)、軟件平臺(tái)、應(yīng)用軟件和應(yīng)用界面。2.數(shù)據(jù)庫(kù)應(yīng)用程序:一個(gè)通過(guò)向DBMS發(fā)出合適的SQL請(qǐng)求語(yǔ)句與數(shù)據(jù)庫(kù)進(jìn)行交互的計(jì)算機(jī)應(yīng)用程序。(包括:數(shù)據(jù)庫(kù)連接、SQL語(yǔ)句執(zhí)行、數(shù)據(jù)庫(kù)返回結(jié)果處理和人機(jī)交互界面)3.數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)從作用范圍的角度可分為三種類型:基于單機(jī)的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)、基于局域網(wǎng)的客戶-服務(wù)器(C/S)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)、基于互聯(lián)網(wǎng)的瀏覽器-服務(wù)器(B/S)的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)。4.數(shù)據(jù)庫(kù)應(yīng)用程序的開發(fā)過(guò)程包含數(shù)據(jù)庫(kù)開發(fā)過(guò)程和應(yīng)用軟件開發(fā)過(guò)程。7.1.1數(shù)據(jù)庫(kù)應(yīng)用程序結(jié)構(gòu)1.三層架構(gòu)(3-tierArchitecture)所謂三層體系架構(gòu)是在客戶端與數(shù)據(jù)庫(kù)之間加入了一個(gè)中間件層,也叫組件層。三層是指邏輯上的三層。三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問(wèn)、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常來(lái)說(shuō),客戶端不與數(shù)據(jù)庫(kù)直接進(jìn)行交互,而是與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫(kù)進(jìn)行交互。表現(xiàn)層(UI):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見所得。業(yè)務(wù)邏輯層(BLL):針對(duì)具體問(wèn)題的操作,也可以說(shuō)是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。數(shù)據(jù)訪問(wèn)層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫(kù),針對(duì)數(shù)據(jù)的增加、刪除、修改、查找等。7.1.2數(shù)據(jù)庫(kù)應(yīng)用開發(fā)方法數(shù)據(jù)庫(kù)類應(yīng)用程序必須涉及到兩個(gè)方面的內(nèi)容,一方面是使用數(shù)據(jù)庫(kù)工具建立庫(kù)表,另一方面是使用開發(fā)工具開發(fā)應(yīng)用程序,并通過(guò)數(shù)據(jù)庫(kù)引擎來(lái)訪問(wèn)對(duì)應(yīng)的數(shù)據(jù)庫(kù)。因此,需要從數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)和軟件開發(fā)生命周期(SDLC)兩個(gè)方面來(lái)把握數(shù)據(jù)庫(kù)應(yīng)用程序的開發(fā)過(guò)程。1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)數(shù)據(jù)庫(kù)開發(fā)生命周期是一個(gè)設(shè)計(jì)、實(shí)現(xiàn)和維護(hù)數(shù)據(jù)庫(kù)系統(tǒng)的過(guò)程,需要符合組織戰(zhàn)略和操作信息的需求。數(shù)據(jù)庫(kù)開發(fā)生命周期與信息系統(tǒng)軟件開發(fā)生命周期是內(nèi)在關(guān)聯(lián)的。DDLC與SDLC是同步進(jìn)行的。2.軟件開發(fā)生命周期(SDLC)軟件開發(fā)生命周期是開發(fā)可靠的、可維護(hù)的、高性能的應(yīng)用程序和其他軟件必須遵守的軟件工程框架。軟件過(guò)程開始于概念的探討,期間經(jīng)歷一系列軟件開發(fā)過(guò)程,結(jié)束于產(chǎn)品的淘汰。1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)了解企業(yè)或組織的運(yùn)營(yíng)狀況,分析信息系統(tǒng)如何幫助解決經(jīng)營(yíng)過(guò)程中存在的問(wèn)題,然后確定系統(tǒng)需求,完成功能規(guī)格說(shuō)明書。可行性研究和需求分析涉及以下內(nèi)容:(1)對(duì)現(xiàn)存系統(tǒng)和程序的分析(2)系統(tǒng)的技術(shù)可行性、操作可行性和經(jīng)濟(jì)可行性分析(3)信息需求和業(yè)務(wù)過(guò)程分析(4)運(yùn)行環(huán)境和用戶特征分析(5)性能和條件約束分析(6)數(shù)據(jù)項(xiàng)、數(shù)據(jù)量、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)處理過(guò)程分析(7)數(shù)據(jù)屬性和內(nèi)在聯(lián)系(數(shù)據(jù)依賴關(guān)系)分析(8)數(shù)據(jù)操作需求分析(9)數(shù)據(jù)安全需求分析1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)確定符合組織需求的數(shù)據(jù)庫(kù)模型(數(shù)據(jù)庫(kù)的概念模型)。功能規(guī)格說(shuō)明書作為數(shù)據(jù)庫(kù)設(shè)計(jì)階段的輸入,進(jìn)行基于選定的DBMS設(shè)計(jì)數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu),并完成數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)格說(shuō)明書。數(shù)據(jù)庫(kù)設(shè)計(jì)涉及以下內(nèi)容:(1)概念數(shù)據(jù)庫(kù)設(shè)計(jì),包括定義數(shù)據(jù)庫(kù)的元素及相互之間的聯(lián)系,定義特定數(shù)據(jù)項(xiàng)的取值約束(2)邏輯數(shù)據(jù)庫(kù)設(shè)計(jì)(3)物理數(shù)據(jù)庫(kù)設(shè)計(jì)1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)根據(jù)選定的DBMS,將詳細(xì)的概念模型轉(zhuǎn)化為DBMS的實(shí)現(xiàn)模型。數(shù)據(jù)庫(kù)實(shí)現(xiàn)階段涉及的內(nèi)容如下:(1)根據(jù)業(yè)務(wù)需求特點(diǎn)和運(yùn)行環(huán)境進(jìn)行DBMS選型(2)詳細(xì)說(shuō)明概念的、外部的和內(nèi)部的數(shù)據(jù)定義(3)概念模型到功能數(shù)據(jù)庫(kù)的映射(4)構(gòu)建數(shù)據(jù)字典(5)創(chuàng)建空的數(shù)據(jù)庫(kù)文件(6)開發(fā)并實(shí)現(xiàn)應(yīng)用程序軟件(7)用戶培訓(xùn)1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)加載應(yīng)用數(shù)據(jù),將舊系統(tǒng)切換到新系統(tǒng)1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)測(cè)試新的數(shù)據(jù)庫(kù),驗(yàn)證預(yù)期結(jié)果1.數(shù)據(jù)庫(kù)開發(fā)生命周期(DDLC)監(jiān)控?cái)?shù)據(jù)內(nèi)容和應(yīng)用程序的發(fā)展和擴(kuò)充,并可能實(shí)施數(shù)據(jù)庫(kù)模式的修改或重組2.軟件開發(fā)生命周期(DDLC)1.需要(或概念)階段:研究和精煉概念,同時(shí)確定和分析客戶(用戶或計(jì)劃)的需求。2.規(guī)格說(shuō)明階段:將用戶需求寫成規(guī)格說(shuō)明文檔,闡述軟件產(chǎn)品的預(yù)期功能。3.計(jì)劃階段:草擬軟件項(xiàng)目管理計(jì)劃,細(xì)化軟件開發(fā)的各個(gè)方面。4.設(shè)計(jì)階段:為實(shí)現(xiàn)軟件規(guī)格說(shuō)明文檔中的功能而經(jīng)歷兩個(gè)連續(xù)的設(shè)計(jì)階段。第一個(gè)階段是概要設(shè)計(jì)階段;第二個(gè)階段是詳細(xì)設(shè)計(jì)階段。這兩個(gè)設(shè)計(jì)階段的文檔描述如何實(shí)現(xiàn)軟件產(chǎn)品。5.編程(編碼或?qū)崿F(xiàn))階段:用特定的計(jì)算機(jī)編程語(yǔ)言編寫各個(gè)模塊的代碼。6.集成(測(cè)試)階段:完成模塊的單獨(dú)測(cè)試和集成測(cè)試,經(jīng)歷Alpha測(cè)試和Beta測(cè)試。7.維護(hù)階段:完成所有維護(hù)工作。當(dāng)增強(qiáng)和更改軟件時(shí),需要更新相應(yīng)的軟件規(guī)格說(shuō)明文檔。7.1.3數(shù)據(jù)庫(kù)應(yīng)用開發(fā)技術(shù)近年來(lái),數(shù)據(jù)庫(kù)應(yīng)用程序三層架構(gòu)不斷發(fā)展,逐步取代了客戶/服務(wù)器模式。在這種模式下,客戶和數(shù)據(jù)庫(kù)服務(wù)器之間增加了一個(gè)應(yīng)用服務(wù)器。原先必須在客戶上實(shí)現(xiàn)的復(fù)雜業(yè)務(wù)邏輯,全部集中到中間件上,完成了客戶端的“減肥”。甚至,客戶端軟件只需要安裝普通的瀏覽器即可。在數(shù)據(jù)庫(kù)應(yīng)用開發(fā)過(guò)程中,首先需要建立數(shù)據(jù)庫(kù)連接,使得應(yīng)用程序能夠與數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)訪問(wèn)操作。常見的數(shù)據(jù)庫(kù)連接方式有ODBC、JDBC和ADO等。在Web數(shù)據(jù)庫(kù)應(yīng)用中,常見的兩大技術(shù)是ASP(ActiveServerPages)技術(shù)和JSP(JavaServerPages)技術(shù)。ASP是一種使嵌入網(wǎng)頁(yè)中的腳本可由Web服務(wù)器執(zhí)行的服務(wù)器端腳本技術(shù),它可以在通過(guò)HTTP請(qǐng)求文檔時(shí)再在Web服務(wù)器上動(dòng)態(tài)創(chuàng)建。JSP是在普通HTML中嵌入了Java程序片段(Scriptlet)和JSP標(biāo)簽的一個(gè)腳本技術(shù)。7.2數(shù)據(jù)庫(kù)連接技術(shù)應(yīng)用程序在訪問(wèn)數(shù)據(jù)庫(kù)時(shí),需要與DBMS建立通信連接。但是,不同廠家的DBMS提供不同的數(shù)據(jù)庫(kù)訪問(wèn)應(yīng)用程序接口(ApplicationProgrammingInterface,API)。因此,需要提供一種統(tǒng)一的數(shù)據(jù)庫(kù)通信方式來(lái)屏蔽不同廠家的DBMS的API差異性。數(shù)據(jù)庫(kù)連接中間件正是這樣一種技術(shù)。本節(jié)主要介紹ODBC、JDBC和嵌入式SQL技術(shù)。(1)ODBC技術(shù)(2)JDBC技術(shù)(3)SQL與宿主語(yǔ)言7.2.1ODBC技術(shù)ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫(kù)互連)是微軟公司開放服務(wù)結(jié)構(gòu)(WOSA,WindowsOpenServicesArchitecture)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分,它建立了一組規(guī)范,并提供了一組對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)API。這些API利用SQL來(lái)完成其大部分任務(wù)。1.ODBC接口為了在Windows平臺(tái)下提供統(tǒng)一的數(shù)據(jù)庫(kù)訪問(wèn)方式,Microsoft公司于1992年推出了ODBC產(chǎn)品,并提供ODBCAPI,使應(yīng)用程序與DBMS在邏輯上分離,應(yīng)用程序只需要調(diào)用ODBCAPI,由ODBC驅(qū)動(dòng)程序?qū)⒄{(diào)用請(qǐng)求轉(zhuǎn)換為對(duì)特定數(shù)據(jù)庫(kù)的調(diào)用請(qǐng)求。同一個(gè)應(yīng)用程序就可以訪問(wèn)不同的數(shù)據(jù)庫(kù)系統(tǒng),存取多個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),從而提高了應(yīng)用程序的可移植性。與嵌入式SQL相比,ODBC一個(gè)最顯著的優(yōu)點(diǎn)是用它生成的應(yīng)用程序與數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)引擎無(wú)關(guān)。2.ODBC體系結(jié)構(gòu)ODBC技術(shù)為應(yīng)用程序提供了一套CLI(Call-LevelInterface,調(diào)用層接口)函數(shù)庫(kù)和基于DLL(DynamicLinkLibrary,動(dòng)態(tài)鏈接庫(kù))的運(yùn)行支持環(huán)境。使用ODBC開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),在應(yīng)用程序中調(diào)用標(biāo)準(zhǔn)的ODBC函數(shù)和SQL語(yǔ)句,通過(guò)可加載的驅(qū)動(dòng)程序?qū)⑦壿嫿Y(jié)構(gòu)映射到具體的DBMS或者應(yīng)用系統(tǒng)所使用的系統(tǒng)中。ODBC是一個(gè)分層的體系結(jié)構(gòu),這樣可保證其標(biāo)準(zhǔn)性和開放性,一個(gè)完整的ODBC由下列幾個(gè)部件組成:用宿主語(yǔ)言和ODBC函數(shù)編寫的應(yīng)用程序用于訪問(wèn)數(shù)據(jù)庫(kù)。其主要任務(wù)是管理安裝ODBC驅(qū)動(dòng)程序和管理數(shù)據(jù)源應(yīng)用程序要訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),首先必須用ODBC管理器注冊(cè)一個(gè)數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫(kù)位置、數(shù)據(jù)庫(kù)類型及ODBC驅(qū)動(dòng)程序等信息,建立起ODBC與具體數(shù)據(jù)庫(kù)的聯(lián)系。只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫(kù)的連接。這樣,應(yīng)用程序就可以通過(guò)驅(qū)動(dòng)程序管理器與數(shù)據(jù)庫(kù)交換信息。驅(qū)動(dòng)程序管理器負(fù)責(zé)將應(yīng)用程序?qū)DBCAPI的調(diào)用傳遞給正確的驅(qū)動(dòng)程序,而驅(qū)動(dòng)程序在執(zhí)行完相應(yīng)的操作后,將結(jié)果通過(guò)驅(qū)動(dòng)程序管理器返回給應(yīng)用程序驅(qū)動(dòng)程序是實(shí)現(xiàn)ODBC函數(shù)和數(shù)據(jù)源交互的DLL,提供了ODBC和數(shù)據(jù)庫(kù)之間的接口。當(dāng)應(yīng)用程序調(diào)用SQLConnect或者SQLDriverConnect函數(shù)時(shí),驅(qū)動(dòng)程序管理器裝入相應(yīng)的驅(qū)動(dòng)程序是驅(qū)動(dòng)程序與DBMS連接的橋梁,數(shù)據(jù)源不是DBMS,而是用于表達(dá)一個(gè)ODBC驅(qū)動(dòng)程序和DBMS特殊連接的命名。在連接中,用數(shù)據(jù)源名來(lái)代表用戶名、服務(wù)器名、連接的數(shù)據(jù)庫(kù)名等,可以將數(shù)據(jù)源名看成是與一個(gè)具體數(shù)據(jù)庫(kù)建立的連接。創(chuàng)建數(shù)據(jù)源最簡(jiǎn)單的方法是使用Windows的ODBC驅(qū)動(dòng)程序管理器7.2.2JDBC技術(shù)JDBC(JavaDataBaseConnectivity,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫的類和接口組成。有了JDBCAPI,就不必為訪問(wèn)Sybase數(shù)據(jù)庫(kù)專門寫一個(gè)程序,為訪問(wèn)Oracle數(shù)據(jù)庫(kù)又專門寫一個(gè)程序,或?yàn)樵L問(wèn)SQLServer數(shù)據(jù)庫(kù)又編寫另一個(gè)程序等。作為API,JDBC為程序開發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫(kù)廠商及第三方中間件廠商實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接提供了標(biāo)準(zhǔn)方法。JDBC使用已有的SQL標(biāo)準(zhǔn)并支持與其他數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn),如ODBC之間的橋接。JDBC實(shí)現(xiàn)了所有這些面向標(biāo)準(zhǔn)的目標(biāo)并且具有簡(jiǎn)單、嚴(yán)格類型定義且高性能實(shí)現(xiàn)的接口。JDBC實(shí)際上做了3件事:建立與數(shù)據(jù)庫(kù)的連接、發(fā)送SQL、處理結(jié)果7.2.2JDBC技術(shù)【例7-1】給定數(shù)據(jù)庫(kù)URL、用戶名和密碼,通過(guò)DriverManager建立數(shù)據(jù)庫(kù)連接,創(chuàng)建Statement對(duì)象,該對(duì)象用于執(zhí)行靜態(tài)SQL語(yǔ)句并返回它所生成結(jié)果,對(duì)得到的結(jié)果集進(jìn)行遍歷并打印結(jié)果。//建立連接Connectioncon=DriverManager.getConnection("jdbc:odbc:wombat","login","password");//發(fā)送SQLStatementstmt=con.createStatement();ResultSetrs=stmt.executeQuery("SELECTDeptNo,DeptName,ManagerFROMDept");//結(jié)果處理While(rs.next()){ StringdeptNo=rs.getString("DeptNo"); StringdeptName=rs.getString("DeptName"); Stringmanager=rs.getString("Manager"); System.out.println(deptNo+""+deptName+""+manager); }7.2.3SQL與宿主語(yǔ)言SQL語(yǔ)言可以獨(dú)立使用,稱為交互式(InteractiveSQL,ISQL)。但I(xiàn)SQL的功能僅限于數(shù)據(jù)庫(kù)上操作,缺少數(shù)據(jù)處理能力。而一個(gè)應(yīng)用程序既要訪問(wèn)數(shù)據(jù),又要處理數(shù)據(jù),把SQL嵌入到程序設(shè)計(jì)語(yǔ)言,如C,C++,Java等,即宿主語(yǔ)言中,將兩者的功能相結(jié)合起來(lái),是目前解決這個(gè)問(wèn)題的實(shí)現(xiàn)途徑。這樣使用的SQL稱為嵌入式SQL(EmbeddedSQL,ESQL)。(1)ESQL的處理過(guò)程(2)ESQL與主語(yǔ)言之間的通信(4)ESQL的使用技術(shù)(3)ESQL的使用規(guī)定7.2.3SQL與宿主語(yǔ)言(1)ESQL的處理過(guò)程

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

ESQL與主語(yǔ)言之間的通信

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

ESQL的使用規(guī)定

為了區(qū)分SQL語(yǔ)句和宿主語(yǔ)言語(yǔ)句,ESQL語(yǔ)句有以下使用規(guī)定:

1.在程序中要區(qū)分SQL語(yǔ)句和宿主語(yǔ)言語(yǔ)句在ESQL中,為了能夠區(qū)分SQL語(yǔ)句與宿主語(yǔ)言語(yǔ)句,所有的SQL語(yǔ)句都必須加前綴標(biāo)識(shí)“EXECSQL”,并以“END_EXEC”作為語(yǔ)句的結(jié)束標(biāo)志。嵌入式SQL語(yǔ)句的格式如:EXECSQL<SQL語(yǔ)句>END_EXEC結(jié)束標(biāo)志在不同的宿主語(yǔ)言中可能是不同的,在C和PASCAL語(yǔ)言程序中規(guī)定結(jié)束標(biāo)志為“;”,而不是“END_EXEC”。7.2.3SQL與宿主語(yǔ)言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語(yǔ)句和宿主語(yǔ)言語(yǔ)句,ESQL語(yǔ)句有以下使用規(guī)定:2.SQL的集合處理方式與宿主語(yǔ)言單記錄處理方式之間的協(xié)調(diào)由于SQL語(yǔ)句處理的是記錄集合,而宿主語(yǔ)言語(yǔ)句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語(yǔ)句如下:1)游標(biāo)定義語(yǔ)句(DECLARE)。游標(biāo)是與某一查詢結(jié)果相聯(lián)系的符號(hào)名,游標(biāo)用SQL的DECLARE語(yǔ)句定義,其格式如下:EXECSQLDECLARE<游標(biāo)名>CURSORFOR <SELECT語(yǔ)句>ENDEXEC游標(biāo)定義語(yǔ)句是一個(gè)說(shuō)明語(yǔ)句,定義中的SELECT并不立即執(zhí)行。7.2.3SQL與宿主語(yǔ)言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語(yǔ)句和宿主語(yǔ)言語(yǔ)句,ESQL語(yǔ)句有以下使用規(guī)定:2.SQL的集合處理方式與宿主語(yǔ)言單記錄處理方式之間的協(xié)調(diào)由于SQL語(yǔ)句處理的是記錄集合,而宿主語(yǔ)言語(yǔ)句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語(yǔ)句如下:2)游標(biāo)打開語(yǔ)句(OPEN)。該語(yǔ)句在執(zhí)行游標(biāo)定義中的SELECT語(yǔ)句,同時(shí)游標(biāo)處于活動(dòng)狀態(tài)。游標(biāo)是一個(gè)指針,此時(shí)指向查詢結(jié)果的第一行之前。OPEN語(yǔ)句的格式如下:EXECSQLOPEN<游標(biāo)名>END_EXEC7.2.3SQL與宿主語(yǔ)言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語(yǔ)句和宿主語(yǔ)言語(yǔ)句,ESQL語(yǔ)句有以下使用規(guī)定:2.SQL的集合處理方式與宿主語(yǔ)言單記錄處理方式之間的協(xié)調(diào)由于SQL語(yǔ)句處理的是記錄集合,而宿主語(yǔ)言語(yǔ)句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語(yǔ)句如下:3)游標(biāo)推進(jìn)語(yǔ)句(FETCH)。此時(shí)游標(biāo)推進(jìn)一行,并把游標(biāo)指向的行(即當(dāng)前行)中的值取出并送到共享變量,其格式如下:EXECSQLFETCHFROM<游標(biāo)名>INTO<變量表>END_EXEC變量表由逗號(hào)分開的共享變量組成。FETCH語(yǔ)句通常置于宿主語(yǔ)言程序的循環(huán)結(jié)構(gòu)中,并借助宿主語(yǔ)言的處理語(yǔ)句逐一處理查詢結(jié)果中的每一個(gè)元組。7.3WEB數(shù)據(jù)庫(kù)系統(tǒng)技術(shù)

Web數(shù)據(jù)庫(kù)管理系統(tǒng)是指基于Web模式的DBMS的信息服務(wù),充分發(fā)揮DBMS高效的數(shù)據(jù)存儲(chǔ)和管理能力,以Web這種瀏覽器/服務(wù)器(B/S)模式為平臺(tái),將客戶端融入統(tǒng)一的Web瀏覽器,為Internet用戶提供使用簡(jiǎn)便、內(nèi)容豐富的服務(wù)。Web數(shù)據(jù)庫(kù)管理系統(tǒng)必將成為Internet和Intranet提供的核心服務(wù),為Internet上的電子商務(wù)提供技術(shù)支持。Web數(shù)據(jù)庫(kù)處理環(huán)境7.3.1ASP.NET技術(shù)

ASP.NET是微軟公司的.NETFrameWork的一部分。它是一個(gè)開發(fā)框架,用于通過(guò)HTML、CSS、JavaScript以及服務(wù)器腳本來(lái)構(gòu)建網(wǎng)頁(yè)和網(wǎng)站。與直接由Web服務(wù)器提供的靜態(tài)HTML不同的是,ASP.NET頁(yè)面實(shí)際上是在服務(wù)器上執(zhí)行以后再產(chǎn)生結(jié)果的。ASP.NET的體系結(jié)構(gòu)7.3.1ASP.NET技術(shù)

所有Web客戶端都通過(guò)Internet信息服務(wù)(IIS)與ASP.NET應(yīng)用程序進(jìn)行通訊。IIS解釋請(qǐng)求并且有選擇地對(duì)請(qǐng)求進(jìn)行身份驗(yàn)證。如果將“允許匿名”設(shè)置為true,則不會(huì)進(jìn)行身份驗(yàn)證。IIS也會(huì)查找所請(qǐng)求的資源(如ASP.NET應(yīng)用程序),如果客戶端得到了授權(quán),則會(huì)返回相應(yīng)的資源。ASP.NET的體系結(jié)構(gòu)7.3.1ASP.NET技術(shù)ASP.NET是ASP和.NET相結(jié)合的產(chǎn)物,它與.NET框架緊密集成,可以利用.NET提供的新功能來(lái)創(chuàng)建動(dòng)態(tài)Web頁(yè)面,其中包含了許多新的特性:(1)代碼編譯執(zhí)行(2)靈活性(3)簡(jiǎn)易性(4)可管理性(5)安全性影響ASP性能的一個(gè)重要的原因就是它是基于腳本(VBScript或JavaScript)的。腳本語(yǔ)言有兩大缺陷:它們是解釋型的并且分類不嚴(yán)格,從而導(dǎo)致執(zhí)行速度慢、效率低。與解釋語(yǔ)言不同,ASP.NET可利用早期綁定、實(shí)時(shí)編譯、本機(jī)優(yōu)化等服務(wù),即便代碼是腳本語(yǔ)言,它也會(huì)在執(zhí)行前被編譯,因此Javascript代碼頁(yè)面的性能也會(huì)得到提高。由于ASP.NET基于公共語(yǔ)言運(yùn)行庫(kù),因此Web應(yīng)用程序開發(fā)人員可以利用整個(gè)平臺(tái)的威力和靈活性。.NET框架類庫(kù)、消息處理和數(shù)據(jù)訪問(wèn)解決方案都可以從Web中無(wú)縫訪問(wèn)。此外,開發(fā)ASP.NET也與語(yǔ)言無(wú)關(guān),所以可以選擇最適合應(yīng)用程序的語(yǔ)言,或跨多種語(yǔ)言來(lái)分割應(yīng)用程序進(jìn)行開發(fā)。在集成的.NET框架中,ASP.NET可以非常方便地開發(fā)Web應(yīng)用程序和XMLWeb服務(wù),同時(shí)站點(diǎn)的配置、發(fā)布也非常方便。對(duì)于簡(jiǎn)單的ASP應(yīng)用程序,配置其實(shí)并不復(fù)雜,但是當(dāng)程序移植到一個(gè)利用組件的N層機(jī)構(gòu)中時(shí)就會(huì)遇到問(wèn)題。當(dāng)對(duì)這些應(yīng)用程序進(jìn)行配置和維護(hù)時(shí),DLL陷阱問(wèn)題就會(huì)出現(xiàn)。ASP.NET中取消了組件注冊(cè)以及DLL鎖定,全面使用了XML配置文件,從而解決了這個(gè)問(wèn)題。作為.NET框架的一部分,ASP.NET提供了很多高級(jí)安全功能,包括實(shí)現(xiàn)身份驗(yàn)證和授權(quán)解決方案的機(jī)制、對(duì)角色和身份標(biāo)識(shí)的支持,可以實(shí)現(xiàn)自定義身份驗(yàn)證和授權(quán)的架構(gòu),與微軟的.NETPassport集成,確保代碼訪問(wèn)安全。7.3.2JSP技術(shù)

JSP(JavaServerPages)是在普通HTML中嵌入了Java程序片段(Scriptlet)和JSP標(biāo)簽的一個(gè)腳本。JSP網(wǎng)頁(yè)Java程序片段可以操縱數(shù)據(jù)庫(kù)、重新定向網(wǎng)頁(yè)以及發(fā)送E-mail等,實(shí)現(xiàn)建立動(dòng)態(tài)網(wǎng)站所需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅是得到的結(jié)果,這樣大大降低了對(duì)客戶瀏覽器的要求,即使客戶瀏覽器端不支持Java,也可以訪問(wèn)JSP網(wǎng)頁(yè)。7.3.2JSP技術(shù)

1.JSP的工作原理7.3.2JSP技術(shù)3.JSP的內(nèi)置對(duì)象(1)Request對(duì)象(2)Response對(duì)象(3)Session對(duì)象(4)Aplication對(duì)象(5)Out對(duì)象(6)Cookie對(duì)象該對(duì)象封裝了用戶提交的信息,通過(guò)調(diào)用該對(duì)象相應(yīng)的方法可以獲取封裝的信息,即使用該對(duì)象可以獲取用戶提交信息。Response對(duì)象對(duì)客戶的請(qǐng)求做出動(dòng)態(tài)的響應(yīng),向客戶端發(fā)送數(shù)據(jù)。Session對(duì)象是一個(gè)JSP內(nèi)置對(duì)象,它在第一個(gè)JSP頁(yè)面被裝載時(shí)自動(dòng)創(chuàng)建,完成會(huì)話期管理。服務(wù)器啟動(dòng)后就產(chǎn)生了Application對(duì)象,當(dāng)客戶再所訪問(wèn)的網(wǎng)站的各個(gè)頁(yè)面之間瀏覽時(shí),這個(gè)Application對(duì)象都是同一個(gè),直到服務(wù)器關(guān)閉。但是與Session不同的是,所有客戶的Application對(duì)象都是同一個(gè),即所有客戶共享這個(gè)內(nèi)置的Application對(duì)象。Out對(duì)象是一個(gè)輸出流,用來(lái)向客戶端輸出數(shù)據(jù)。Cookie是Web服務(wù)器保存在用戶硬盤上的一段文本。Cookie允許一個(gè)Web站點(diǎn)在用戶的電腦上保存信息并且隨后再取回它。Cookie是以“關(guān)鍵字key=值value“的格式來(lái)保存紀(jì)錄的。7.3.2JSP技術(shù)

4.JSP的簡(jiǎn)單例子【例7-3】通過(guò)newDate()顯示當(dāng)前日期和時(shí)間,創(chuàng)建JSP文件,其內(nèi)容如下:保存為example.jsp,并發(fā)布于Tomcat服務(wù)器,該JSP文件將被編譯成Servlet。<html><head><title>FirstPage</title></head><body><H3>Hello,todayis:<%=newjava.util.Date()%><!--將編譯成Servlet,在服務(wù)器端運(yùn)行--></H3></body></html>例7-3在Tomcat服務(wù)器上運(yùn)行的結(jié)果7.3.2JSP技術(shù)

5.JSP通過(guò)JDBC連接數(shù)據(jù)庫(kù)(1)獲取數(shù)據(jù)庫(kù)連接(2)執(zhí)行SQL語(yǔ)句(3)處理執(zhí)行結(jié)果(4)釋放連接用DriverManager獲取數(shù)據(jù)庫(kù)連接,如SQLServer數(shù)據(jù)庫(kù)的連接://SQLServer的JDBC驅(qū)動(dòng)程序名稱StringdriverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";//名為Teaching數(shù)據(jù)庫(kù)的SQLServer連接字符串Stringurl="jdbc:sqlserver://localhost:1433;DatabaseName=Teaching";StringuserName="sa";//用戶名StringuserPwd="sa";//密碼Class.forName(driverName);Connectionconn=DriverManager.getConnection(url,userName,userPwd);可以采用Statement或PreparedStatement來(lái)執(zhí)行SQL語(yǔ)句,如:Stringsql;Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);//執(zhí)行數(shù)據(jù)查詢語(yǔ)句(select)stmt.executeUpdate(sql);//執(zhí)行數(shù)據(jù)更新語(yǔ)句(delete、update、insert、drop等)stmt.close();遍歷訪問(wèn)結(jié)果集的形式如:while(rs.next()){ System.out.println("第一個(gè)字段值為:"+rs.getString(1));System.out.println("姓名為:"+rs.getString(“姓名”));}一般地,先關(guān)閉ResultSet,然后關(guān)閉Statement(或者PreparedStatement),最后關(guān)閉Connection。連接關(guān)閉如下:rs.close();//關(guān)閉ResultSetstmt.close();//關(guān)閉Statementconn.close();//關(guān)閉Connection7.4游標(biāo)編程

DBMS通過(guò)游標(biāo)(Cursor)提供了一種從記錄集中逐一訪問(wèn)記錄的靈活手段。就本質(zhì)而言,游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條SQL選擇語(yǔ)句(Select)相關(guān)聯(lián)。SQLServer支持三種類型的游標(biāo):Transact_SQL游標(biāo),API服務(wù)器游標(biāo)和客戶游標(biāo)。7.4游標(biāo)編程

(1)Transact_SQL游標(biāo)Transact_SQL游標(biāo)是由DECLARECURSOR語(yǔ)法定義,主要用在Transact_SQL腳本、存儲(chǔ)過(guò)程和觸發(fā)器中。Transact_SQL游標(biāo)主要用在服務(wù)器上,由從客戶端發(fā)送給服務(wù)器的Transact_SQL語(yǔ)句或是批處理、存儲(chǔ)過(guò)程、觸發(fā)器中的Transact_SQL進(jìn)行管理。Transact_SQL游標(biāo)不支持提取數(shù)據(jù)塊或多行數(shù)據(jù)。(2)API游標(biāo)API服務(wù)器游標(biāo)支持在OLEDB、ODBC以及DB_library中使用游標(biāo)函數(shù),主要用在服務(wù)器上。每一次客戶端應(yīng)用程序調(diào)用API游標(biāo)函數(shù),SQLServer的OLEDB提供者、ODBC驅(qū)動(dòng)器或DB_library的動(dòng)態(tài)鏈接庫(kù)(DLL)都會(huì)將這些客戶請(qǐng)求傳送給服務(wù)器以對(duì)API服務(wù)器游標(biāo)進(jìn)行處理。(3)客戶游標(biāo)客戶游標(biāo)主要是當(dāng)在客戶機(jī)上緩存結(jié)果集時(shí)才使用。在客戶游標(biāo)中,有一個(gè)默認(rèn)的結(jié)果集被用來(lái)在客戶機(jī)上緩存整個(gè)結(jié)果集??蛻粲螛?biāo)僅支持靜態(tài)游標(biāo)而非動(dòng)態(tài)游標(biāo)。由于服務(wù)器游標(biāo)并不支持所有的Transact-SQL語(yǔ)句或批處理,所以客戶游標(biāo)常常僅被用作服務(wù)器游標(biāo)的輔助。因?yàn)樵谝话闱闆r下,服務(wù)器游標(biāo)能支持絕大多數(shù)的游標(biāo)操作。7.4.2游標(biāo)結(jié)構(gòu)

定義一個(gè)游標(biāo)的語(yǔ)法格式如下:DECLAREcursor_name[INSENSITIVE][SCROLL]CURSOR

FORselect_statement

[FOR{READONLY|UPDATE[OFcolumn_name[,…n]]}]cursor_name:游標(biāo)的名字。INSENSITIVE:將游標(biāo)定義所選取出來(lái)的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)。對(duì)該游標(biāo)的讀取操作皆由臨時(shí)表來(lái)應(yīng)答。因此,對(duì)基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會(huì)隨著基本表內(nèi)容的改變而改變,同時(shí)也無(wú)法通過(guò)游標(biāo)來(lái)更新基本表。如果不使用該保留字,那么對(duì)基本表的更新、刪除都會(huì)反映到游標(biāo)中。

SCROLL:表明所有的提取操作(如FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)都可用。如果不使用該保留字,那么只能進(jìn)行NEXT提取操作。由此可見,SCROLL極大地增加了提取數(shù)據(jù)的靈活性,可以隨意讀取結(jié)果集中的任一行數(shù)據(jù)記錄,而不必關(guān)閉再重開游標(biāo)。

select_statement:定義結(jié)果集的SELECT語(yǔ)句。應(yīng)該注意的是,在游標(biāo)中不能使用COMPUTE、COMPUTEBY、FORBROWSE、INTO語(yǔ)句。

READONLY:表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新,盡管在默認(rèn)狀態(tài)下游標(biāo)是允許更新的。而且在UPDATE或DELETE語(yǔ)句的WHERECURRENTOF子句中,不允許對(duì)該游標(biāo)進(jìn)行引用。

UPDATE[OFcolumn_name[,…n]]:定義在游標(biāo)中可被修改的列,如果不指出要更新的列,那么所有的列都將被更新。當(dāng)游標(biāo)被成功創(chuàng)建后,游標(biāo)名成為該游標(biāo)的唯一標(biāo)識(shí),也是在以后的存儲(chǔ)過(guò)程、觸發(fā)器或Transact_SQL腳本中使用的名字。7.4.3游標(biāo)編程

每一個(gè)游標(biāo)必須有4個(gè)組成部分,它們必須符合以下順序:聲明(DECLARE)游標(biāo)打開(OPEN)游標(biāo)從一個(gè)游標(biāo)中逐條獲?。‵ETCH)并處理記錄信息關(guān)閉(CLOSE)或釋放(DEALLOCATE)游標(biāo)游標(biāo)是用于迭代訪問(wèn)SELECT語(yǔ)句查詢出的結(jié)果集。聲明游標(biāo)就是確定游標(biāo)的屬性,制定游標(biāo)的查詢結(jié)果集。聲明游標(biāo)的語(yǔ)法格式已經(jīng)在上一節(jié)進(jìn)行了描述。打開游標(biāo)語(yǔ)句執(zhí)行游標(biāo)定義中的查詢語(yǔ)句,查詢結(jié)果存放在游標(biāo)緩沖區(qū)中,并使游標(biāo)指針指向游標(biāo)區(qū)中的第一個(gè)元組,作為游標(biāo)的默認(rèn)訪問(wèn)位置。查詢結(jié)果的內(nèi)容取決于查詢語(yǔ)句的設(shè)置和查詢條件。打開游標(biāo)的語(yǔ)法如下:OPEN游標(biāo)名稱;讀游標(biāo)區(qū)數(shù)據(jù)語(yǔ)句是讀取游標(biāo)區(qū)中當(dāng)前元組的值,并將各分量依次賦給指定的共享主變量。FETCH語(yǔ)句用于讀取游標(biāo)中的數(shù)據(jù),語(yǔ)句格式為:FETCH[[NEXT|PRIOR|FIRST|LAST|ABSOLUTEn|RELATIVEn]from]游標(biāo)名[INTO@局部變量[,…n]]NEXT:表示返回結(jié)果集中當(dāng)前行的下一行記錄,如果第一次讀取則返回第一行。默認(rèn)的讀取選項(xiàng)為NEXT。PRIOR:表示返回結(jié)果集中當(dāng)前行的前一行記錄,如果第一次讀取則沒有行返回,并且把游標(biāo)置于第一行之前。FIRST:表示返回結(jié)果集中的第一行,并且將其作為當(dāng)前行。LAST:表示返回結(jié)果集中的最后一行,并且將其作為當(dāng)前行。ABSOLUTEn:如果n為正數(shù),則返回從游標(biāo)頭開始的第n行,并且返回行變成新的當(dāng)前行;如果n為負(fù),則返回從游標(biāo)末尾開始的第n行,并且返回行為新的當(dāng)前行;如果n為0,則返回當(dāng)前行。RELATIVEn:如果n為正數(shù),則返回從當(dāng)前行開始的第n行;如果n為負(fù),則返回從當(dāng)前行之前的第n行;如果為0,則返回當(dāng)前行。INTO:表示將游標(biāo)當(dāng)前字段值賦值給對(duì)應(yīng)的局部變量。在處理完游標(biāo)中數(shù)據(jù)之后必須關(guān)閉游標(biāo)來(lái)釋放數(shù)據(jù)結(jié)果集和定位于數(shù)據(jù)記錄上的鎖。CLOSE語(yǔ)句關(guān)閉游標(biāo),但不釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。如果準(zhǔn)備在隨后的使用中再次打開游標(biāo),則應(yīng)使用CLOSE命令。關(guān)閉游標(biāo)的語(yǔ)法規(guī)則為:CLOSE{{[GLOBAL]cursor_name}|cursor_variable_name}游標(biāo)可應(yīng)用在存儲(chǔ)過(guò)程、觸發(fā)器和Transact_SQL腳本中。如果在聲明游標(biāo)與釋放游標(biāo)之間使用了事務(wù)結(jié)構(gòu),則在結(jié)束事務(wù)時(shí)游標(biāo)會(huì)自動(dòng)關(guān)閉。7.4.2游標(biāo)結(jié)構(gòu)

(5)釋放游標(biāo)在使用游標(biāo)時(shí),各種針對(duì)游標(biāo)的操作或者引用游標(biāo)名,或者引用指向游標(biāo)的游標(biāo)變量。當(dāng)CLOSE命令關(guān)閉游標(biāo)時(shí),并沒有釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。因此常使用DEALLOCATE命令。通過(guò)該命令可以刪除掉游標(biāo)與游標(biāo)名或游標(biāo)變量之間的聯(lián)系,并且釋放游標(biāo)占用的所有系統(tǒng)資源。其語(yǔ)法規(guī)則為:DEALLOCATE{{[GLOBAL]cursor_name}|@cursor_variable_name}當(dāng)使用DEALLOCATE@cursor_variable_name來(lái)刪除游標(biāo)時(shí),游標(biāo)變量并不會(huì)被釋放,除非超過(guò)使用該游標(biāo)的存儲(chǔ)過(guò)程、觸發(fā)器的范圍(即游標(biāo)的作用域)。7.5.1存儲(chǔ)過(guò)程的概念

存儲(chǔ)過(guò)程是一組已被編輯在一起的,存儲(chǔ)在服務(wù)器上的,執(zhí)行某種功能的預(yù)編譯SQL語(yǔ)句。它是一種封裝重復(fù)任務(wù)操作方法,支持用戶提供的參數(shù)變量,具有強(qiáng)大的編程能力。存儲(chǔ)過(guò)程非常類似于DOS系統(tǒng)中的批處理文件。它將完成某項(xiàng)任務(wù)的許多SQL語(yǔ)句寫在一起,組成命令集合的形式,然后通過(guò)執(zhí)行該存儲(chǔ)過(guò)程就可以完成相應(yīng)的任務(wù)。存儲(chǔ)過(guò)程具有許多優(yōu)點(diǎn):(1)加快程序的執(zhí)行速度(2)減少網(wǎng)絡(luò)的數(shù)據(jù)流量(3)提供了一種安全機(jī)制(4)允許程序模塊化設(shè)計(jì)(5)提高編程的靈活性7.5.1存儲(chǔ)過(guò)程的概念

在SQLServer中,存儲(chǔ)過(guò)程包括系統(tǒng)存儲(chǔ)過(guò)程、本地存儲(chǔ)過(guò)程、臨時(shí)存儲(chǔ)過(guò)程、遠(yuǎn)程存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程。(1)系統(tǒng)存儲(chǔ)過(guò)程以sp_開頭,用來(lái)進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定、取得信息和相關(guān)管理工作。(2)本地存儲(chǔ)過(guò)程用戶創(chuàng)建的存儲(chǔ)過(guò)程是由用戶創(chuàng)建并完成某一特定功能的存儲(chǔ)過(guò)程,事實(shí)上一般所說(shuō)的存儲(chǔ)過(guò)程就是指本地存儲(chǔ)過(guò)程。(3)臨時(shí)存儲(chǔ)過(guò)程臨時(shí)存儲(chǔ)過(guò)程分為兩種存儲(chǔ)過(guò)程:一是本地臨時(shí)存儲(chǔ)過(guò)程,以井字號(hào)(#)作為其名稱的第一個(gè)字符,該存儲(chǔ)過(guò)程將成為一個(gè)存放在TEMPDB數(shù)據(jù)庫(kù)中的本地臨時(shí)存儲(chǔ)過(guò)程,且只有創(chuàng)建它的用戶才能執(zhí)行它;二是全局臨時(shí)存儲(chǔ)過(guò)程,以兩個(gè)井字號(hào)(##)開始,該存儲(chǔ)過(guò)程將成為一個(gè)存儲(chǔ)在TEMPDB數(shù)據(jù)庫(kù)中的全局臨時(shí)存儲(chǔ)過(guò)程,全局臨時(shí)存儲(chǔ)過(guò)程一旦創(chuàng)建,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需要特定的權(quán)限。7.5.1存儲(chǔ)過(guò)程的概念

在SQLServer中,存儲(chǔ)過(guò)程包括系統(tǒng)存儲(chǔ)過(guò)程、本地存儲(chǔ)過(guò)程、臨時(shí)存儲(chǔ)過(guò)程、遠(yuǎn)程存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程。(4)遠(yuǎn)程存儲(chǔ)過(guò)程在SQLServer中,遠(yuǎn)程存儲(chǔ)過(guò)程(RemoteStoredProcedures)是位于遠(yuǎn)程服務(wù)器上的存儲(chǔ)過(guò)程,通??梢允褂梅植际讲樵兒虴XECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲(chǔ)過(guò)程。(5)擴(kuò)展存儲(chǔ)過(guò)程擴(kuò)展存儲(chǔ)過(guò)程(ExtendedStoredProcedures)是用戶可以使用外部程序語(yǔ)言編寫的存儲(chǔ)過(guò)程,而且擴(kuò)展存儲(chǔ)過(guò)程的名稱通常以xp_開頭。7.5.1存儲(chǔ)過(guò)程的概念

在SQLServer中,存儲(chǔ)過(guò)程包括系統(tǒng)存儲(chǔ)過(guò)程、本地存儲(chǔ)過(guò)程、臨時(shí)存儲(chǔ)過(guò)程、遠(yuǎn)程存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程。(4)遠(yuǎn)程存儲(chǔ)過(guò)程在SQLServer中,遠(yuǎn)程存儲(chǔ)過(guò)程(RemoteStoredProcedures)是位于遠(yuǎn)程服務(wù)器上的存儲(chǔ)過(guò)程,通??梢允褂梅植际讲樵兒虴XECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲(chǔ)過(guò)程。(5)擴(kuò)展存儲(chǔ)過(guò)程擴(kuò)展存儲(chǔ)過(guò)程(ExtendedStoredProcedures)是用戶可以使用外部程序語(yǔ)言編寫的存儲(chǔ)過(guò)程,而且擴(kuò)展存儲(chǔ)過(guò)程的名稱通常以xp_開頭。7.5.2存儲(chǔ)過(guò)程結(jié)構(gòu)

存儲(chǔ)過(guò)程包括過(guò)程首部和過(guò)程體兩部分,其創(chuàng)建語(yǔ)句的基本格式如下:CREATEPROC[EDURE]procedure_name[;number] /*存儲(chǔ)過(guò)程首部*/[{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]AS<SQL語(yǔ)句塊>[…n]/*存儲(chǔ)過(guò)程體,描述該存儲(chǔ)過(guò)程的操作*/procedure_name:存儲(chǔ)過(guò)程名稱[;number]:可選的整數(shù),用來(lái)對(duì)同名的過(guò)程分組@parameter:參數(shù)列表{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}:RECOMPILE表明SQLServer不會(huì)緩存該過(guò)程的計(jì)劃,該過(guò)程將在運(yùn)行時(shí)重新編譯。FORREPLICATION:指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲(chǔ)過(guò)程。7.5.2存儲(chǔ)過(guò)程結(jié)構(gòu)

關(guān)于參數(shù)的使用說(shuō)明如下:?每個(gè)存儲(chǔ)過(guò)程中最多設(shè)定1024個(gè)參數(shù)?用名字來(lái)標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須指定值的參數(shù)類型?每個(gè)參數(shù)名前要有一個(gè)“@”符號(hào),每一個(gè)存儲(chǔ)過(guò)程的參數(shù)僅為該程序內(nèi)部使用?data_type參數(shù)的數(shù)據(jù)類型。所有數(shù)據(jù)類型(包括text、ntext和image)均可以用作存儲(chǔ)過(guò)程的參數(shù)。不過(guò),cursor數(shù)據(jù)類型只能用于OUTPUT參數(shù)。如果指定的數(shù)據(jù)類型為cursor,也必須同時(shí)指定VARYING和OUTPUT關(guān)鍵字。?VARYING指定作為輸出參數(shù)支持的結(jié)果集(由存儲(chǔ)過(guò)程動(dòng)態(tài)構(gòu)造,內(nèi)容可以變化)。僅適用于游標(biāo)參數(shù)。?OUTPUT表明參數(shù)是返回參數(shù)。該選項(xiàng)的值可以返回給EXEC[UTE]。使用OUTPUT參數(shù)可將信息返回給調(diào)用過(guò)程。使用OUTPUT關(guān)鍵字的輸出參數(shù)可以是游標(biāo)占位符。存儲(chǔ)過(guò)程的參數(shù)可以定義輸入?yún)?shù)(INPUT)、輸出參數(shù)(OUTPUT)、輸入/輸出參數(shù)(INPUT/OUTPUT)。默認(rèn)為INPUT參數(shù)。?default參數(shù)的默認(rèn)值。如果定義了默認(rèn)值,不必指定該參數(shù)的值即可執(zhí)行過(guò)程。默認(rèn)值必須是常量或NULL。7.5.3存儲(chǔ)過(guò)程編程

存儲(chǔ)過(guò)程的操作操作包括創(chuàng)建、重命名、執(zhí)行和刪除4種(2)重命名存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程的重命名語(yǔ)句格式為:ALTERPROCEDURE舊過(guò)程名稱RENAMETO新過(guò)程名稱;(3)執(zhí)行存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程的執(zhí)行語(yǔ)句格式為:

CALL/PERFORM/EXECUTEPROCEDURE過(guò)程名([參數(shù)1,參數(shù)2,…]);在大多數(shù)DBMS中數(shù)據(jù)庫(kù)服務(wù)器支持存儲(chǔ)過(guò)程的嵌套調(diào)用。(4)刪除存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程的刪除語(yǔ)句格式為:

DROPPROCEDURE過(guò)程名;(5)帶有游標(biāo)的存儲(chǔ)過(guò)程在存儲(chǔ)過(guò)程中可以使用游標(biāo)來(lái)遍歷SELECT語(yǔ)句的結(jié)果集,從而對(duì)逐條數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯處理。7.6觸發(fā)器編程

從本質(zhì)上看,觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,它不同于我們前面介紹過(guò)的存儲(chǔ)過(guò)程。觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過(guò)程可以通過(guò)存儲(chǔ)過(guò)程名字而被直接調(diào)用。觸發(fā)器在插入、刪除或修改特定表中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行,它比數(shù)據(jù)庫(kù)本身標(biāo)準(zhǔn)的功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。當(dāng)使用INSERT、DELETE、UPDATE命令對(duì)觸發(fā)器所保護(hù)的數(shù)據(jù)進(jìn)行修改時(shí),觸發(fā)器能夠被自動(dòng)激活,從而確保對(duì)數(shù)據(jù)的處理必須符合由這些SQL語(yǔ)句所定義的規(guī)則。它除了能夠完成復(fù)雜的完整性約束以外,還可以在主動(dòng)數(shù)據(jù)庫(kù)(ActiveDatabase)的應(yīng)用中對(duì)不同的外部事件做出及時(shí)反應(yīng)。7.6.1觸發(fā)器的概念

條件:觸發(fā)器將測(cè)試條件是否成立。如果條件成立,就執(zhí)行相應(yīng)動(dòng)作,否則什么也不做。觸發(fā)器(Trigger)是數(shù)據(jù)庫(kù)模式的一個(gè)元素。它是一個(gè)能由系統(tǒng)自動(dòng)執(zhí)行對(duì)數(shù)據(jù)庫(kù)修改的語(yǔ)句。觸發(fā)器有時(shí)也稱為“主動(dòng)規(guī)則”(ActiveRule)或“事件-條件-動(dòng)作規(guī)則”(Event-Condition-ActionRule,ECA規(guī)則)。它的結(jié)構(gòu)如下:ON事件;IF前提條件;THEN動(dòng)作;一個(gè)觸發(fā)器由3部分組成:

事件:事件是指對(duì)數(shù)據(jù)庫(kù)的插入、刪除、修改等操作。觸發(fā)器在這些事件開始發(fā)生時(shí)將開始工作。

動(dòng)作:如果觸發(fā)器測(cè)試滿足預(yù)定的條件,那么就由DBMS執(zhí)行這些動(dòng)作,即對(duì)數(shù)據(jù)庫(kù)的操作。這些動(dòng)作能使觸發(fā)事件不發(fā)生,即撤銷事件,如刪除一個(gè)插入的元組等。這些動(dòng)作也可以是一系列對(duì)數(shù)據(jù)庫(kù)的操作,甚至可以是與觸發(fā)事件本身無(wú)關(guān)的其他操作。7.6.1觸發(fā)器的概念

業(yè)務(wù)規(guī)則:業(yè)務(wù)是對(duì)基本規(guī)則簡(jiǎn)潔的正式陳述,這些基本規(guī)則是企業(yè)中業(yè)務(wù)運(yùn)作的基礎(chǔ)。觸發(fā)器在數(shù)據(jù)庫(kù)處理中充當(dāng)很多角色:

維護(hù)約束:前面討論了觸發(fā)器可以用于維護(hù)外碼和語(yǔ)義約束。這種類型的觸發(fā)器通常形式是使用ONDELETE和ONUPDATE子句。

監(jiān)控:由于在數(shù)據(jù)庫(kù)中每條新記錄的插入都是一個(gè)事件,觸發(fā)器可以間接地用于監(jiān)控這些對(duì)象的狀態(tài)。輔助高速緩存數(shù)據(jù)的維護(hù):物化視圖(MATERIALIZEDVIEW)是這類應(yīng)用的實(shí)例。每當(dāng)物化視圖的基礎(chǔ)表發(fā)生改變時(shí),與該基礎(chǔ)表相連的觸發(fā)器就會(huì)更新物化視圖。簡(jiǎn)化應(yīng)用設(shè)計(jì):將核心編程邏輯從異常處理中分離出來(lái),可以相當(dāng)大地簡(jiǎn)化某些應(yīng)用。若異??梢员荒P突癁閿?shù)據(jù)庫(kù)中的更新操作,則觸發(fā)器是此類應(yīng)用的理想實(shí)現(xiàn)途徑。7.6.2觸發(fā)器結(jié)構(gòu)

SQLServer觸發(fā)器的語(yǔ)法如下:CREATETRIGGER觸發(fā)器名稱ON{table|view}[WITHENCRYPTION]{{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[WITHAPPEND][NOTFORREPLICATION]AS<SQL語(yǔ)句塊>}}7.6.2觸發(fā)器結(jié)構(gòu)

其中參數(shù)說(shuō)明如下:table|view:是在其上執(zhí)行觸發(fā)器的表或視圖,有時(shí)稱為觸發(fā)器表或觸發(fā)器視圖??梢赃x擇是否指定表或視圖的所有者名稱。WITHENCRYPTION:加密Syscomments表中包含CREATETRIGGER語(yǔ)句文本的條目。AFTER:指定觸發(fā)器只有在觸發(fā)SQL語(yǔ)句中指定的所有操作都已成功執(zhí)行后才激發(fā)INSTEADOF:指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā)SQL語(yǔ)句,從而替代觸發(fā)語(yǔ)句的操作。DELETE,INSERT,UPDATE:指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語(yǔ)句時(shí)將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個(gè)選項(xiàng)。WITHAPPEND:指定應(yīng)該添加現(xiàn)有類型的其他觸發(fā)器。WITHAPPEND不能與INSTEADOF觸發(fā)器一起使用,或者如果顯式聲明AFTER觸發(fā)器,也不能使用該子句。NOTFORREPLICATION:表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時(shí),不應(yīng)執(zhí)行該觸發(fā)器。AS:是觸發(fā)器要執(zhí)行的操作。sql_statement:是觸發(fā)器的條件和操作。觸發(fā)器條件指定其他準(zhǔn)則,以確定DELETE、INSERT或UPDATE語(yǔ)句是否導(dǎo)致執(zhí)行觸發(fā)器操作。7.6.3觸發(fā)器編程

(1)創(chuàng)建觸發(fā)器

(2)修改觸發(fā)器修改觸發(fā)器的語(yǔ)句如下:ALTERTRIGGERtrigger_name

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論