版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲(chǔ)過程8.3ODBC編程8.1嵌入式SQL建立數(shù)據(jù)庫后就要開發(fā)應(yīng)用系統(tǒng)了。標(biāo)準(zhǔn)化SQL是非過程化的查詢語言,具有操作統(tǒng)一、面向集合、功能豐富、使用簡單等多項(xiàng)優(yōu)點(diǎn)。但和程序設(shè)計(jì)語言相比,高度非過程化的優(yōu)點(diǎn)同時(shí)也成了它的缺點(diǎn):缺少流程控制能力,難以實(shí)現(xiàn)業(yè)務(wù)中的邏輯控制,SQL編程技術(shù)可以有效克服這一缺點(diǎn),提高應(yīng)用系統(tǒng)和RDBMS間互操作性。應(yīng)用系統(tǒng)中使用SQL編程來訪問和管理數(shù)據(jù)庫中數(shù)據(jù)的方式主要有:嵌入式SQL、PL/SQL(存儲(chǔ)過程)、ODBC編程、JDBC編程和OLEDB編程等方式。嵌入式SQL是將SQL語句嵌入程序設(shè)計(jì)語言中,被嵌入的程序設(shè)計(jì)語言,如C,C++,PB,JAVA,VB等稱謂宿主語言,簡稱主語言。對(duì)ESQL,RDBMS一般采用預(yù)編譯方法處理,即由RDBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識(shí)別出ESQL語句,把它們轉(zhuǎn)換成語言調(diào)用語句,以使主語言編譯程序能識(shí)別它們,然后由主語言的編譯程序?qū)⒓兊闹髡Z言程序編譯成目標(biāo)碼。在ESQL中,為了能夠區(qū)分SQL語句和主語言語句,所有SQL語句都必須加標(biāo)志。但不同主語言所規(guī)定加的標(biāo)志不同。8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL與主語言的通信數(shù)據(jù)庫工作單元與源程序工作單元之間的通信主要包括:1、向主語言傳遞SQL語句執(zhí)行狀態(tài)信息,使主語言能夠據(jù)此信息控制程序流程,主要用SQL通信區(qū)SQLCommunicationArea(簡稱SQLCA)實(shí)現(xiàn);2、主語言向SQL語句提供參數(shù),主要用主變量(HostVariable)實(shí)現(xiàn);3、將SQL語句查詢數(shù)據(jù)庫的結(jié)果交給主語言處理,主要用主變量和游標(biāo)(Cursor)實(shí)現(xiàn)。一、SQL通信區(qū)SQL語句執(zhí)行后,系統(tǒng)要反饋給主語言若干信息主要包括描述系統(tǒng)當(dāng)前工作狀態(tài)的運(yùn)行環(huán)境的各種數(shù)據(jù)。這些信息將送到SQLCA中。主語言從SQLCA中取出這些狀態(tài)信息,據(jù)些決定接下來的的流程。SQLCA在應(yīng)用程序中要事先加以定義,一般都是系統(tǒng)級(jí)變量。SQLCA中有一個(gè)變量SQLCODE用來存放每次執(zhí)行SQL語句后返回的狀態(tài)代碼。主語言每執(zhí)行完一條SQL語句之后都不得應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理。二、主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)。SQL語句中使用的主語言程序變量簡稱為主變量。主變量根據(jù)其作用的不同,分為輸入主變量和輸出主變量。輸入主變量由主語言對(duì)其賦值,SQL引用;輸出主變量由SQL語句對(duì)其賦值或設(shè)置狀態(tài)信息,返回給主語言。一個(gè)主變量可以附帶一個(gè)任選的指示變量(IndicatorVariable)。指示變量是一個(gè)整型變量,用來“指示”所指主變量的值或條件。指示變量可以指示輸入主變量是否為空值,可以檢測(cè)輸出主變量是否是空值,值是否被截?cái)?。所有主變量的指示變量必須在SQL語句{}之間進(jìn)行說明。說明之后,主變量可以在SQL語句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn),為了與數(shù)據(jù)庫對(duì)象名區(qū)別,SQL語句中的主變量名和指示變量前要加“:”作為標(biāo)志。三、游標(biāo)SQL是面向集合的,一條SQL語句可以產(chǎn)生或處理多條記錄。而主語言是面向記錄的,一組變量一次只能存取一條記錄。所以需要用游標(biāo)來協(xié)調(diào)這兩種不同的處理方式。游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果,每個(gè)游標(biāo)都有一個(gè)名字,用戶可以通過游標(biāo)逐一獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理。四、建立和關(guān)閉數(shù)據(jù)庫連接嵌入式SQL程序要訪問數(shù)據(jù)庫必須先連接數(shù)據(jù)庫。RDBMS根據(jù)用戶信息對(duì)連接請(qǐng)求進(jìn)行合法性驗(yàn)證,只有通過身份驗(yàn)證,才能建立一個(gè)合法連接。1、建立數(shù)據(jù)庫連接2、關(guān)閉數(shù)據(jù)庫連接當(dāng)某個(gè)連接上的所有數(shù)據(jù)庫操作完成后,應(yīng)用程序應(yīng)該主動(dòng)釋放所占用的連接資源。五、程序?qū)嵗?,以PB為主語言進(jìn)行講解8.1.3不用游標(biāo)的SQL語句有的ESQL語句不需要使用游標(biāo),它們是:說明性語句、數(shù)據(jù)定義語句、數(shù)據(jù)控制語句、查詢結(jié)果為單記錄的SELECT語句、非CURRENT形式的增刪語句。一、查詢結(jié)果為單記錄的SELECT語句例:根據(jù)學(xué)生學(xué)號(hào)查詢學(xué)生信息,假設(shè)已經(jīng)把要查詢的學(xué)號(hào)賦給了主變量givensnoEXECSQLSELECTSNO,SNAME,SSEX,SAGE,SDEPTINTO:HSNO,:HNAME,:HSEX,:HAGE,:HDEPTFROMSTUDENTWHERESNO=:givensno;二、非CURRENT形式的增刪改語句有些增刪語句不需要使用游標(biāo),不是CURRENT形式的,在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量。EXECSQLUPDATEscSETgrade=:newgradeWHEREsno=:givensno;sageid=-1;EXECSQLUPDATEstudentSETsage=NULLWHEREsdept='CS';EXECSQLDELETEFROMscWHEREsno={SELECTsnoFROMstudentwheresname=:stuname);8.4.1使用游標(biāo)的SQL語句必須使用游標(biāo)的SQL的語句有:查詢結(jié)果為多條記錄的SELECT語句、CURRENT形式的UPDATE和DELETE語句。一、查詢結(jié)果為多條記錄的SELECT語句(1)用DELCARE說明游標(biāo);(2)用OPEN語句打開游標(biāo);(3)用FETCH語句推進(jìn)游標(biāo),一般用一循環(huán)結(jié)構(gòu);(4)使用完后,用CLOSE關(guān)閉游標(biāo)。游標(biāo)關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系。但關(guān)閉的游標(biāo)可以再次打開使用,方法同上。二、CURRENT形式的UPDATE和DELETE語句UPDATE和DELETE語句都是集合操作,如果只想修改或刪除其中的某個(gè)記錄,則需要用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄,從中進(jìn)一步找出要修改或刪除的記錄,然后用CURRENT形式的UPDATE和DELETE語句操作。即要用子句WHERECURRNETOF<游標(biāo)名>8.1.5動(dòng)態(tài)SQL動(dòng)態(tài)SQL方法允許主語言在運(yùn)行過程中臨時(shí)“組裝”SQL語句。動(dòng)態(tài)SQL支持動(dòng)態(tài)組裝SQL語句和動(dòng)態(tài)參數(shù)兩種形式,給開發(fā)者提供設(shè)計(jì)任意SQL語句的能力。一、使用SQL語句主變量二、動(dòng)態(tài)參數(shù)1.聲明SQL語句主變量2.準(zhǔn)備SQL語句(PREPARE)3.執(zhí)行準(zhǔn)備好的語句(EXECUTE)8.2存儲(chǔ)過程SQL99標(biāo)準(zhǔn)中給出了SQL-invokedroutines的概念,它可以分為存儲(chǔ)過程(SQL-invokedprocedure)和函數(shù)(SQL-invokedfunction)兩類。8.2.1PL/SQL的塊結(jié)構(gòu)基本的SQL是高度非過程化的語言。ESQL將SQL語句嵌入程序設(shè)計(jì)語言,借助高級(jí)語言的控制功能實(shí)現(xiàn)過程化。PL/SQL程序的基本結(jié)構(gòu)是塊。所有的PL/SQL程序都是由塊組成的。這些塊之間可以互相嵌套,每個(gè)塊完成一個(gè)邏輯操作。定義部分{執(zhí)行部分{DECLARE變量、常量、游標(biāo)、異常等/*定義的變量、常量等只能在該基本塊中使用,當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在。*/BEGINSQL語句、PL/SQL的流程控制語句EXCEPTION異常處理部分/*在出現(xiàn)異常時(shí),采取相應(yīng)的措施*/END;8.2.2變量和常量的定義1.PL/SQL中定義變量的語法形式是變量名數(shù)據(jù)類型[[NOTNULL]]:=初值表達(dá)式或變量名數(shù)據(jù)類型[[NOTNULL]初值表達(dá)式]2.常量的定義類似于變量的定義常量名數(shù)據(jù)類型CONSTANT:=常量表達(dá)式常量必須要給一個(gè)值,并且該值在存在期間或常量的作用哉內(nèi)不能改變。3.賦值語句變量名稱:=表達(dá)式8.2.3控制語句PL/SQL提供了流程控制語句,使用時(shí)要參考具體的產(chǎn)品手冊(cè)的語法規(guī)則一、條件控制語句1.IF<條件表達(dá)式>THEN{語句序列}ENDIF2.IF<條件表達(dá)式>THEN{語句序列1}ELSE{語句序列2}ENDIF3.在THEN和ELSE子句中還可以嵌套使用IF語句。二、循環(huán)控制語句1、最簡單的循環(huán)語句LOOPLOOP{循環(huán)體,一組PL/SQL語句}ENDLOOP;多數(shù)RDBMS的PL/SQL都提供了EXIT、BREAK等循環(huán)結(jié)束語句,以保證LOOP語句能夠在適當(dāng)?shù)臈l件下結(jié)束。2、WHILE-LOOPWHILE<條件> LOOP{語句序列}ENDLOOP;3、FOR-LOOPFOR計(jì)數(shù)器IN[步長]下界…上界LOOP{語句序列}ENDLOOP三、錯(cuò)誤處理如果PL/SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理。使用時(shí)要根據(jù)具體DBMS系統(tǒng)來進(jìn)行處理。8.2.4存儲(chǔ)過程存儲(chǔ)過程和函數(shù)是命名塊,它們被編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運(yùn)行速度快。一、存儲(chǔ)過程的優(yōu)點(diǎn)1、由于存儲(chǔ)過程不像解釋執(zhí)行的SQL語句那樣在提出操作請(qǐng)求時(shí)才進(jìn)行語法分析和優(yōu)化工作,因而運(yùn)行效率高,它提供了在服務(wù)器端快速執(zhí)行SQL語句的有效途徑。2、存儲(chǔ)過程降低了客戶機(jī)和服務(wù)器之間的通信量??蛻魴C(jī)上的應(yīng)用程序只要通過網(wǎng)絡(luò)向服務(wù)器發(fā)出存儲(chǔ)過程的名字的參數(shù),就可以讓RDBMS執(zhí)行許多條SQL語句,并執(zhí)行數(shù)據(jù)處理,只有最終處理結(jié)果才返回客戶端。3、方便實(shí)施企業(yè)規(guī)則??梢园哑髽I(yè)規(guī)則的運(yùn)算程序?qū)懗纱鎯?chǔ)過程放入數(shù)據(jù)庫服務(wù)器中,由RDBMS管理,既有利于集中控制,又能方便地進(jìn)行維護(hù)。當(dāng)用戶規(guī)則發(fā)生變化時(shí)只要修改存儲(chǔ)過程,無須修改其他應(yīng)用程序。二、存儲(chǔ)過程的用戶接口1、創(chuàng)建存儲(chǔ)過程
CREATEProcedure<過程名>([參數(shù)1,參數(shù)2,…])AS<{語句序列}>2、執(zhí)行存儲(chǔ)過程
CALL/PERFORMProcedure<過程名>([參數(shù)1,參數(shù)2,…])3、刪除存儲(chǔ)過程DROPProcedure<過程名>三、游標(biāo)和嵌入式SQL一樣,在PL/SQL中如果SELECT語句只返回一條記錄,可以將該結(jié)果存放到變量中。當(dāng)查詢返回多條記錄時(shí),就要使用游標(biāo)對(duì)結(jié)果集進(jìn)行處理。一個(gè)游標(biāo)與一個(gè)SQL語句相關(guān)聯(lián)。8.3ODBC編程8.3.1數(shù)據(jù)庫互連概述提出和產(chǎn)生ODBC的原因是不同的數(shù)據(jù)庫管理系統(tǒng)的存在。目前廣泛使用的RDBMS有多種,盡管這些系統(tǒng)都是關(guān)系數(shù)據(jù)庫,也都遵循SQL標(biāo)準(zhǔn),但不同的系統(tǒng)有許多差異。因此,在某個(gè)RDBMS下編寫的應(yīng)用程序就不能在另一個(gè)RDBMS下運(yùn)行,適應(yīng)性和可移植性較差。更加重要的是,許多應(yīng)用程序需要共享多個(gè)部門的數(shù)據(jù)資源,訪問不同的RDBMS。為此,用戶需要有連接不同RDBMS的方法和技術(shù),使數(shù)據(jù)庫系統(tǒng)“開放”,能夠“數(shù)據(jù)庫互連”。ODBC是微軟公司開放服務(wù)體系(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分,它建立了一組規(guī)范,并提供一組訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)API。作為規(guī)范它具有兩重功效:規(guī)范應(yīng)用開發(fā);規(guī)范RDBMS應(yīng)用接口。8.3.2ODBC工作原理概述ODBC開發(fā)應(yīng)用系統(tǒng)的體系結(jié)構(gòu),由四部分組成:一、應(yīng)用程序應(yīng)用程序提供用戶界面、應(yīng)用邏輯和事務(wù)邏輯。使用開發(fā)數(shù)據(jù)庫應(yīng)用程序時(shí),應(yīng)用程序調(diào)用的是標(biāo)準(zhǔn)的ODBC函數(shù)和SQL語句。應(yīng)用層使用ODBCAPI調(diào)用接口與數(shù)據(jù)庫進(jìn)行交互。ODBC應(yīng)用程序包括的內(nèi)容有:請(qǐng)求連接數(shù)據(jù)庫;向數(shù)據(jù)源發(fā)送SQL語句;為SQL語句執(zhí)行結(jié)果分配存儲(chǔ)空間定義所讀取的數(shù)據(jù)格式;獲取數(shù)據(jù)庫操作結(jié)果或處理錯(cuò)誤;進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果;請(qǐng)求事務(wù)的提交和回滾操作;斷開與數(shù)據(jù)源的連接。二、驅(qū)動(dòng)程序管理器驅(qū)動(dòng)程序管理是用來管理各種驅(qū)動(dòng)程序的。驅(qū)動(dòng)程序管理器是由微軟公司提供,它包含在ODBC32.DLL中,對(duì)用戶是透明的。它管理應(yīng)用程序和驅(qū)動(dòng)程序之間的通信。驅(qū)動(dòng)程序管理可以建立、配置或刪除數(shù)據(jù)源,并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫ODBC驅(qū)動(dòng)程序。三、數(shù)據(jù)庫驅(qū)動(dòng)程序ODBC通過驅(qū)動(dòng)程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺(tái)的獨(dú)立性。ODBC應(yīng)用程序不能直接存取數(shù)據(jù)庫,其各種操作請(qǐng)求由驅(qū)動(dòng)程序管理器提交給某個(gè)RDBMS的ODBC驅(qū)動(dòng)程序,通過調(diào)用驅(qū)動(dòng)程序支持的函數(shù)來存取數(shù)據(jù)庫。數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動(dòng)程序返回給應(yīng)用程序。四、ODBC數(shù)據(jù)源管理數(shù)據(jù)源是最終用戶需要訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,實(shí)際上是一種數(shù)據(jù)連接的抽象。ODBC給每個(gè)被訪問的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(DataSourceName,DSN)。在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫名等。最終用戶無需知道DBMS或其他數(shù)據(jù)庫管理軟件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GBT 31909-2015 可滲透性燒結(jié)金屬材料 透氣度的測(cè)定》專題研究報(bào)告
- 《GBT 31897.1-2015 燈具性能 第 1 部分:一般要求》專題研究報(bào)告
- 《GB-T 16134-2011中小學(xué)生健康檢查表規(guī)范》專題研究報(bào)告
- 《GBT 31946-2015 水電站壓力鋼管用鋼板》專題研究報(bào)告
- 《AQ 6208-2007煤礦用固定式甲烷斷電儀》專題研究報(bào)告
- 2026年四川財(cái)經(jīng)職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫及答案詳解1套
- 設(shè)備租賃還款連帶責(zé)任擔(dān)保合同
- 置業(yè)顧問崗位招聘考試試卷及答案
- 竹編工藝師崗位招聘考試試卷及答案
- 2025年保健科慢性病患者康復(fù)指導(dǎo)與生活方式干預(yù)考核試題及答案
- 2025秋期版國開電大本科《心理學(xué)》一平臺(tái)形成性考核練習(xí)1至6在線形考試題及答案
- MOOC 英語影視欣賞-蘇州大學(xué) 中國大學(xué)慕課答案
- 校園火災(zāi)發(fā)生時(shí)教師如何迅速報(bào)警并組織疏散
- 護(hù)理人員配置原則與標(biāo)準(zhǔn)
- 血尿病人的護(hù)理
- 阿爾及利亞醫(yī)療器械法規(guī)要求綜述
- 為深度學(xué)習(xí)而教:促進(jìn)學(xué)生參與意義建構(gòu)的思維工具
- 跨境人民幣業(yè)務(wù)
- 交城縣惠豐生物科技有限公司年產(chǎn)10000噸N,N-二甲基苯胺項(xiàng)目環(huán)境影響報(bào)告書
- 管理運(yùn)籌學(xué)(第三版) 韓伯棠課件第十一章
- GB/T 17215.302-2013交流電測(cè)量設(shè)備特殊要求第2部分:靜止式諧波有功電能表
評(píng)論
0/150
提交評(píng)論