第4章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL4_第1頁
第4章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL4_第2頁
第4章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL4_第3頁
第4章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL4_第4頁
第4章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL4_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

14.7嵌入式SQL

SQL語言提供了兩種工作方式:交互式SQL、嵌入式SQL

前面介紹的SQL,是作為獨立的數(shù)據(jù)語言可以直接以交互的方式使用的,除此之外,SQL還可以作為子語言嵌入在宿主語言中使用,這里所說的宿主語言就是指我們常見的高級程序設(shè)計語言,如C、C++、Java等等。下邊主要介紹SQL作為子語言嵌入在宿主語言中使用的一般方法。把SQL嵌入到宿主語言中使用必須要解決以下三個方面的問題:1.嵌入識別問題。宿主語言的編譯程序不能識別SQL語句,所以首要的問題就是要解決如何區(qū)分宿主語言的語句和SQL語句。2.宿主語言與SQL語言的數(shù)據(jù)交互問題。SQL語句的查詢結(jié)果必須能夠交給宿主語言處理,宿主語言的數(shù)據(jù)也要能夠交給SQL語句使用。3.語言的單記錄與SQL的多記錄的問題。宿主語言一般一次處理一條記錄,而SQL常常處理的是記錄(元組)的集合,這個矛盾必須解決。2宿主語言的編譯系統(tǒng)不能識別SQL語句。解決這個問題的一般方法是,為SQL語句加一個特殊的前綴,在用宿主語言的編譯系統(tǒng)編譯源程序之前,首先由預(yù)編譯系統(tǒng)將SQL語句轉(zhuǎn)換為宿主語言的合法函數(shù)調(diào)用。常用的前綴格式是:EXECSQL

如:EXECSQLINSERTINTO職工VALUES(“WH8”,“E20”,1560);

下圖示意了嵌入了SQL的應(yīng)用程序的執(zhí)行過程。嵌入了SQL語句的應(yīng)用程序,首先要經(jīng)過預(yù)編譯轉(zhuǎn)換成宿主語言源程序,接著由宿主語言的編譯系統(tǒng)產(chǎn)生中間代碼,然后根據(jù)中間代碼、宿主語言函數(shù)庫和SQL函數(shù)據(jù)庫連接產(chǎn)生可執(zhí)行程序,執(zhí)行程序時由SQL語句通過DBMS訪問數(shù)據(jù)庫。應(yīng)用程序預(yù)編譯編譯連接執(zhí)行應(yīng)用程序DBMS源程序SQL庫函數(shù)宿主語言庫函數(shù)中間代碼可執(zhí)行程序數(shù)據(jù)庫(一)嵌入識別與預(yù)編譯3(二)數(shù)據(jù)通信區(qū)與主變量在嵌入使用SQL語句的程序中,一般在程序的前部都要有一條:

INCLUDESQLCA這里的SQLCA即是SQL與宿主語言的通信區(qū),它類似于結(jié)構(gòu)變量,各個分量分別反映SQL語句的各種執(zhí)行狀態(tài)。負責(zé)SQL語句與宿主語言語句數(shù)據(jù)交換的是主(Host)變量,這種變量既可以用在SQL語句中,又可以用在宿主語言語句中。本章首頁本節(jié)首頁上一頁這種變量必須在DECLARESECTION中說明,說明的格式是:

BEGINDECLARESECTION…

主變量說明…ENDDECLARESECTION4經(jīng)以上方式說明的主變量可以在SQL語句中使用,只是用在SQL語句中時,必須冠以冒號前綴,如:UPDATE倉庫SET面積=:wh_areaWHERE倉庫號=:whnumb;

主變量用在宿主語言語句中時,和一般程序變量的使用方法是一樣的。本章首頁本節(jié)首頁上一頁下面是在C語言程序中說明主變量的例子:EXECSQLBEGINDECLARESECTIONcharwhnumb[5]charcity[12]intwh_areaEXECSQLENDDECLARESECTION;

5(三)游標(biāo)(Cursor)宿主語言一般只能在單記錄方式下工作,即一次處理一個記錄。而SQL語句的查詢結(jié)果常常是一張表,它包含多個記錄,為此需要用游標(biāo)(Cursor)作為橋梁做一些特殊處理。與游標(biāo)有關(guān)的命令共有四條:

DECLARECURSOROPENFETCHCLOSE通過下面的介紹我們會發(fā)現(xiàn)游標(biāo)類似于文件的概念,游標(biāo)有時的含義是整個“文件”,有時的含義是指向某個記錄的指針。下面我們通過具體的幾條語句來理解游標(biāo)的概念。定義游標(biāo)的DECLARECURSOR語句的格式是:EXECSQLDECLARE<游標(biāo)名>CURSORFOR

<SELECT-查詢塊>;

該語句用<SELECT-查詢塊>定義一個游標(biāo)(文件),它的內(nèi)容是:<SELECT-查詢塊>的查詢結(jié)果(多個記錄組成的表)。6啟動或打開游標(biāo)(文件)的語句是OPEN,其格式是:

EXECSQL

OPEN<游標(biāo)名>;

該語句的功能是打開或啟動指出的游標(biāo)。該游標(biāo)名是用DECLAERCURSOR語句已經(jīng)定義好的。執(zhí)行該語句意味著執(zhí)行在DECLARECURSOR語句中定義的SELECT查詢,并使游標(biāo)(指針)指向查詢結(jié)果的第一條記錄。7讀記錄的FETCH語句的格式是:

EXECSQL

FETCH<游標(biāo)名>

INTO:<主變量1>,:<主變量2>…;

該語句的功能是取出游標(biāo)所指記錄并送入主變量,同時向前撥動游標(biāo),使游標(biāo)指向下一條記錄。這里的游標(biāo)必須是已經(jīng)說明并打開了的,INTO后的主變量要與在DECLARECURSOR中SELECT的字段相對應(yīng)。當(dāng)查詢結(jié)果為空,或游標(biāo)已經(jīng)指向查詢結(jié)果集的結(jié)尾時,SQLCA.sqlcode的代碼將為-1,說明游標(biāo)沒有指向新記錄。關(guān)閉游標(biāo)(文件)的CLOSE語句的格式是:

EXECSQL

CLOSE

<游標(biāo)名>;該語句的功能是關(guān)閉或停止指出的游標(biāo)。與程序設(shè)計語言中的文件相對照,DECLARECURSOR相當(dāng)于說明了一個文件,OPEN相當(dāng)于打開文件,F(xiàn)ETCH相當(dāng)于讀一條記錄,CLOSE相當(dāng)于關(guān)閉文件。EXECSQLDECLARE<游標(biāo)名>

CURSORFOR

<SELECT-查詢塊>;8學(xué)生(學(xué)號,姓名,性別,年齡,所在系)課程(課程號,課程名,學(xué)分)選課(學(xué)號,課程號,成績)94.7.3嵌入式SQL的使用技術(shù)1.不涉及游標(biāo)的SQLDML語句【例4.43】給出在C語言中不涉及游標(biāo)的嵌入式SQLDML語句的使用例子。(1)在學(xué)生表中,根據(jù)共享變量sno的值查詢學(xué)生的姓名、性別和年齡。

EXECSQLSELECT姓名,性別,年齡

INTO

:name,:sex,:ageFROM學(xué)生

WHERE學(xué)號=:sno;這里,sno、name、sex、age都是共享變量,已在主程序中定義,并用SQL的DECLARE語句說明,在使用時加上“:”作為標(biāo)識,以區(qū)別數(shù)據(jù)庫中的變量。主程序中已先賦值給sno,SELECT的查詢結(jié)果(一條記錄)送到共享變量name、sex、age中。10(2)在學(xué)生表中插入一條新紀(jì)錄,數(shù)據(jù)已在相關(guān)的共享變量中。

EXECSQLINSERT學(xué)生(學(xué)號,姓名,性別,年齡)

VALUES(:sno,:name,:sex,:age);

如果某個屬性值未給出,則自動置為空值。(3)從選課表中刪除一個學(xué)生的各個成績,學(xué)號在共享變量sno中。

EXECSQLDELETEFROM選課

WHERE學(xué)號=:sno;(4)將所有學(xué)生的“MATHS”課程成績增加某個值(在共享變量a中)。

EXECSQLUPDATE選課

SET成績=成績+:aWHERE課程號IN(SELECT課程號

FROM課程

WHERE課程名=‘MATHS’);112.涉及游標(biāo)的SQLDML語句當(dāng)SELECT語句的查詢結(jié)果為多個元組時,宿主語言程序無法使用,所以一定要有游標(biāo)機制將多個元組一次一個地傳送給宿主語言程序進行處理。具體有以下步驟:先用游標(biāo)定義語句定義一個游標(biāo)和某個SELECT語句對應(yīng)。游標(biāo)打開后,處于活動狀態(tài),此時游標(biāo)指向查詢結(jié)果集的第一個元組前。每執(zhí)行一次FETCH語句,游標(biāo)指向下一個元組,并把其值送到共享變量,供程序處理,如此反復(fù),直到所有查詢結(jié)果處理完畢。最后關(guān)閉游標(biāo);關(guān)閉的游標(biāo)也可以重新打開,與新的查詢結(jié)果集相對應(yīng),在沒有打開前不能使用。12【例4.44】在教學(xué)數(shù)據(jù)庫中檢索成績不及格的學(xué)生信息(學(xué)號,姓名,課程,成績),下面是該查詢的一個C函數(shù)。#defineNO_MORE_TUPLES!(strcmp(SQLSTATE,“02000”))Voidsel(){EXECSQLBEGINDECLARESECTIONCharsno[5],sname[9],cname[11];

Intg;

CharSQLSTATE[6];

EXECSQLENDDECLARESECTION;EXECSQLDECLAREscxCURSORFOR

SELECT學(xué)生.學(xué)號,姓名,課程名,成績

FROM學(xué)生,課程,選課

WHERE學(xué)生.學(xué)號=選課.學(xué)號and課程.課程號=選課.課程號and成績<60;

13EXECSQLOPENscx;While(1){EXECSQL

FETCHFROMscx

INTO:sno,:sname,:cname,:g;If(NO_MORE_TUPLES)break;Printf(“%s,%s,%s,%d\n”,sno,sname,cname,g);}EXECSQLCLOSEscx;}這里使用了C語言中的宏定義NO_MORE_TUPLES,表示查不到元組時,其值為1.在游標(biāo)處于活動狀態(tài)時,可以修改或刪除游標(biāo)指向的元組。14【例4.45】在上例中對成績作如下處理:對不及格的成績分別加10分,顯示不及格的學(xué)生信息。修改while(1){…}語句為:While(1){EXECSQLFETCHFROMscxINTO:sno,:sname,:cname,:g;If(NO_MORE_TUPLES)break;

EXECSQL

UPDATE

選課SET成績=成績+10WHERECURRENTOFscx;Printf(“%s,%s,%s,%d\n”,sno,sname,cname,g);}153滾動游標(biāo)的定義和推進之前我們介紹的游標(biāo)在推進時只能沿查詢結(jié)果集中的元組順序一行行推進,不能回退,這給使用帶來不便。SQL2標(biāo)準(zhǔn)提供了滾動游標(biāo)(ScrollCursor)技術(shù),游標(biāo)在推進時可以上下滾動,進退自如。(1)滾動游標(biāo)的定義語句。

DECLARE<游標(biāo)名>SCROLLCURSEFOR<SELECT語句>END_EXEC;與前面的游標(biāo)定義語句比較,這里多了一個關(guān)鍵字“SCROLL”。滾動游標(biāo)的打開和關(guān)閉語句與前面一樣。16(2)滾動游標(biāo)的推進語句。

NEXTPRIOR

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論