版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第八章數據庫編程嵌入式SQL存儲過程
ODBC編程8.1嵌入式SQL引入嵌入式SQL的原因SQL語言是非過程性語言,缺少流程控制能力;8.1.1嵌入式SQL的處理過程嵌入式SQL將SQL語言嵌入程序設計語言即宿主語言中,將SQL語言訪問數據庫的功能和宿主語言的數據處理功能相結合,這樣使用的SQL稱為嵌入式SQL(Embedded
SQL,ESQL)嵌入式SQL的基本處理過程主語言程序含ESQL語句RDMS的預處理程序ESQL語句轉換為函數主語言編譯程序目標語言程序為了區(qū)分SQL語句與主語言語句,所有SQL語句都需要加前綴,一般格式為:EXEC
SQL
<SQL語句>;例:EXEC
SQL
DROP
TABLE
Student
;一般形式8.1.2嵌入式SQL語句與主語言之間的通信SQL語句:描述性的面向集合的語句-負責操縱數據庫高級語言語句:過程性的面向記錄的語句-負責控制程序流程工作單元之間的通信方式SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息主語言能夠據此控制程序流程主變量主語言向SQL語句提供參數將SQL語句查詢數據庫的結果交主語言進一步處理游標解決集合性操作語言與過程性操作語言的不匹配定義SQLCA:EXEC
SQL
INCLUDE
SQLCA使用SQLCA:SQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預定義的常量SUCCESS,則表示
SQL語句成功,否則表示出錯應用程序每執(zhí)行完一條SQL語句之后都應該測試一下
SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應處理一、SQL通信區(qū)(SQL
Communication
Area,SQLCA)二、主變量(
Host
Variable)主變量的分類與作用輸入主變量:由應用程序賦值,SQL引用。輸出主變量:SQL對其賦值或設置狀態(tài)信息,返回給應用程序。SQL語句使用宿主語言的程序變量來輸入/輸出數據,這樣的變量簡稱為主變量.指示變量:整型變量用來“指示”所指主變量的值或條件用途:輸入主變量可以利用指示變量賦空值輸出主變量可以利用指示變量檢測出是否空值,值是否被截斷在SQL語句中說明主變量和指示變量BEGIN
DECLARE
SECTION.................. (說明主變量和指示變量).........END
DECLARE
SECTION在SQL語句中使用主變量SQL語句中的主變量名前要加冒號(:)作為標志在SQL語句使用指示變量指示變量前也必須加冒號(:)標志必須緊跟在所指主變量之后例如::Hgrade
:Gradeid例:根據學生號碼查詢學生信息。假設已將要查詢的學生的學號給了主變量givensnoEXEC
SQL
SELECT
Sno,
Sname,
Ssex,
Sage,
SdeptINTO
:Hsno,
:Hname,
:Hsex,
:Hage,
:HdeptFROM
StudentWHERE
Sno=:givensno;Hsno,Hname,Hsex,Hage,Hdept和givensno均是主變量,并均已在前面的程序中說明了。三、游標(Cursor)為什么要使用游標當查詢結果超過一個元組時,不能一次性將結果值賦給宿主語言的變量,因為主變量僅能保存一個數據,而不是一組數據。游標的概念游標是系統(tǒng)為用戶開設的一個數據緩沖區(qū),存放SQL的執(zhí)行結果。?游標的定義和使用定義游標EXEC
SQL
DECLARE
SX
CURSOR
FORSELECT
Sno,Sname,Ssex,Sage
/*SX對應語句的執(zhí)行結果FROM
StudentWHERE
SDept
=
:deptname;打開游標EXEC
SQL
OPEN
SX;執(zhí)行SELECT語句,將結果放入結果集中。推進游標EXEC
SQL
FETCH
SX
INTO
:HSno,
….;移動指針,改變結果集的當前記錄。通過游標更新數據關閉游標四、建立和關閉數據庫連接建立數據庫連接:EXEC
SQL
CONNECT
TO
target
[AS
connection-name][USER
user-name]target-要連接的數據庫服務器??梢允且粋€常見的服務器標識串,如dbname@<hostname>:<port>;或是包含服務器標識的SQL串常量,也可以是DEFAULT。connection-name-可選的連接名,連接必須是一個有效的標識符,用來識別一個程序內同時建立的多個連接。關閉數據庫連接:EXEC
SQL
DISCONNECT
[
connection]修改當前連接EXEC
SQL
SET
CONNECT
connection-name|DEFAULT五、舉例:帶有嵌入式SQL的一小段C程序/*主變量說明開始*//*主變量說明結束*/EXEC
SQL
BEGIN
DEC
LARE
SECTION;char
deptname[64];char
HSno[64];char
HSname[64];char
HSsex[64];int
HSage;int
NEWAGE;EXEC
SQL
END
DECLARE
SECTION;long
SQLCODE;:
EXEC
SQL
INCLUDE
sqlca;/*定義SQL通信區(qū)*/例題:依次檢查某個系的學生記錄,交互式更新某些學生年齡/*C語言主程序開/*變量yn代表yes或noint
main(void){
int
count
=
0;char
yn;printf("Please
choose
the
department
name(CS/MA/IS):
");scanf("%s",deptname);
/*為主變量deptname賦EXEC
SQL
CONNECT
TO
TEST@localhost:54321
USER"SYSTEM"/"MANAGER";
/*連接數據庫TEST*/18EXEC
SQL
DECLARE
SX
CURSOR
FOR/*定義游標*CSELECT
Sno,
Sname,
Ssex,
Sage/*SX對應語句的執(zhí)行結DFROM
Student21WHERE
Sdept
=
:deptname;22
EXEC
SQL
OPEN
SX;*//*打開游標SX便指向查詢結果的第一行G for(;;)
/*用循環(huán)結構逐條處理結果集中的記錄*/24
{
EXEC
SQL
FETCH
SX
INTO
:HSno,
:HSname,
:HSsex,:HSage;/*推進游標,將當前數據放入主變量*/。。。。。。。。。。。。。If
(yn
==
‘y’
||yn
==
‘Y’){。。。。。。。。。。。。。/*嵌入式SQL更新語句*373839EXEC
SQL
UPDATE
StudentSET
Sage
=
:NEWAGEWHERE
CURRENT
OF
SX
;}
/*對當前游標指向的學生年齡進行更新*//*關閉游標SX不再和查詢結果對應*/}EXEC
SQL
CLOSE
SX;EXEC
SQL
COMMIT
WORK;/*提交更新*//*斷開數據庫連接*/42
EXEC
SQL
DISCONNECT
TEST;}1
EXEC
SQL
BEGIN
DEC
LARE
SECTION;8
EXEC
SQL
END
DECLARE
SECTION;:
EXEC
SQL
INCLUDE
sqlca;/*主變量說明開始*//*主變量說明結束*//*定義SQL通信區(qū)*/C語言程序開始/*定義游標*/EXEC
SQL
DECLARE
SX
CURSOR
FOREXEC
SQL
OPEN
SX;EXEC
SQL
CLOSE
SX;16
EXEC
SQL
CONNECT
TO
。。。。
/*連接數據庫TEST*/18F4041EXEC
SQL
COMMIT
WORK;EXEC
SQL
DISCONNECT
TEST;/*提交更新*//*斷開數據庫連接*/C語言程序結束程序框架8.1.3不用游標的SQL語句不用游標的SQL語句的種類:說明性語句數據定義語句數據控制語句查詢結果為單記錄的SELECT語句非CURRENT形式的增刪改語句一、查詢結果為單記錄的SELECT語句語句格式:EXEC
SQL
SELECT
[ALL|DISTINCT]<目標列表達式>[,<目標列表達式>]...INTO <主變量>[<指示變量>]
[,<主變量>[<指示變量>]]..FROM <表名或視圖名>[,<表名或視圖名>]
...[WHERE<條件表達式>][GROUP
BY<列名1>[HAVING<條件表達式>]][ORDER
BY<列名2>[ASC|DESC]];例1:根據學生號碼查詢學生信息。假設已將要查詢的學生的學賦給了主變量givensnoEXEC
SQL
SELECT
Sno,
Sname,
Ssex,
Sage,
Sdept
INTO
:Hsno,
:Hname,
:Hsex,
:Hage,
:HdeptFROM
StudentWHERE
Sno=:givensno;Hsno,Hname,Hsex,Hage,Hdept和givensno均是主變量,并均已在前面的程序中說明了。使用注意事項:查詢結果為多條記錄的處理程序出錯,RDBMS會在SQLCA中返回錯誤信息使用主變量INTO子句、WHERE子句的條件表達式、HAVING短語的條件表達式均可以使用主變量使用指示變量指示變量只能用于INTO子句中。查詢結果為空值的處理如果數據庫中沒有滿足條件的記錄,系統(tǒng)會自動將相應主變量后面的指示變量置為負值,而不再向該主變量賦值;當發(fā)現指示變量值為負值時,不管主變量為何值,均應認為主變量值為NULL例2:查詢某個學生選修某門課程的成績。假設已將要查詢的學生的學號賦給了主變量givensno,將課程號賦給了主變量givencno。EXEC
SQL
SELECT
Sno,
Cno,
GradeINTO
:Hsno,
:Hcno,
:Hgrade:GradeidFROM
SCWHERE
Sno=:givensno
ANDCno=:givencno;如果Gradeid<0,不論Hgrade為何值,均認為該學生成績?yōu)榭罩?!二、非CURRENT形式的增刪語句1.非CURRENT形式的UPDATE語句:使用主變量——SET子句、WHERE子句使用指示變量——SET子句非CURRENT形式的UPDATE語句可以操作多條元組例1:將全體學生1號課程的考試成績增加若干分。假設增加的分數已賦給主變量RaiseEXEC
SQL
UPDATE
SCSET
Grade=Grade+:RaiseWHERE
Cno="1";例2:修改某個學生1號課程的成績。假設該學生的學號已賦給主變量givensno,修改后的成績已賦給主變量newgrade。EXEC
SQL
UPDATE
SCSET
Grade=:newgradeWHERE
Sno=:givensno
AND
Cno="1";例3:將計算機系全體學生年齡置NULL值Sageid=-1;EXEC
SQL
UPDATE
StudentSET
Sage=:Raise:SageidWHERE
Sdept="CS";2.非CURRENT形式的DELETE語句使用主變量——WHERE子句非CURRENT形式的DELETE語句可以操作多條元組例4:某個學生退學了,現要將有關他的所有選課記錄刪除掉。假設該學生的姓名已賦給主變量stdnameEXEC
SQL
DELETEFROM
SCWHERE
Sno=(SELECT
SnoFROM
StudentWHERE
Sname=:stdname);3.非CURRENT形式的INSERT語句使用主變量——VALUES子句使用指示變量——VALUES子句非CURRENT形式的INSERT語句一次只能輸入一條元組例5:某個學生新選修了某門課程,將有關記錄插入SC表,假設學生的學號已賦給主變量stdno,課程號已賦給主變量couno。gradeid=-1;
/*用作指示變量,賦為負值*/EXEC
SQL
INSERTINTO
SC(Sno,
Cno,
Grade)VALUES(:stdno,
:couno,
:gr:gradeid);8.1.4使用游標的SQL語句必須使用游標的SQL語句:查詢結果為多條記錄的SELECT語句
CURRENT形式的UPDATE、DELETE語句一、查詢結果為多條記錄的SELECT語句使用游標的步驟:說明游標打開游標移動游標指針,然后取當前記錄關閉游標說明游標使用DECLARE語句:EXEC
SQL
DECLARE<游標名>CURSORFOR
<SELECT語句>;功能:是一條說明性語句,這時DBMS并不執(zhí)行SELECT指定的查詢操作。打開游標:使用OPEN語句EXEC
SQL
OPEN<游標名>;功能:打開游標實際上是執(zhí)行相應的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中。這時游標處于活動狀態(tài),指針指向查詢結果集中第一條記錄之前3.推進游標指針并取當前記錄:使用FETCH語句EXEC
SQL
FETCH
[[NEXT|PRIOR|FIRST|LAST]FROM]<游標名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;功能:指定方向推動游標指針,然后將緩沖區(qū)中的當前記錄取出來送至主變量供主語言進一步處理。
NEXT|PRIOR|FIRST|LAST:指定推動游標指針的方式,缺省值為NEXT4.關閉游標:使用CLOSE語句EXEC
SQL
CLOSE<游標名>;功能:關閉游標,釋放結果集占用的緩沖區(qū)及其他資源說明:游標被關閉后,就不再和原來的查詢結果集相聯系。被關閉的游標可以再次被打開,與新的查詢結果相聯系例1:查詢某個系全體學生的信息(學號、姓名、性別和年齡)。要查詢的系名由用戶在程序運行過程中指定,放在主變量deptname中......EXEC
SQL
INCLUDE
SQLCA;EXEC
SQL
BEGIN
DECLARE
SECTION;....../*說明主變量deptname,HSno,HSname,HSsex,HSage等*/......EXEC
SQL
END
DECLARE
SECTION;......gets(deptname);
/*為主變量deptname賦值*/EXEC
SQL
DECLARE
SX
CURSOR
FORSELECT
Sno,
Sname,
Ssex,
SageFROM
StudentWHERE
SDept=:deptname;
/*說明游標*/EXEC
SQL
OPEN
SX/*打開游標*/WHILE(1)/*用循環(huán)結構逐條處理結果集中的記錄*/{
EXEC
SQL
FETCH
SX
INTO
:HSno,
:HSname,
:HSsex,
:HSagif
(sqlca.sqlcode
<>
SUCCESS)break;/*若所有查詢結果均已處理完或出現SQL語句錯誤,則退出循環(huán)
*//*由主語言語句進行進一步處理
*/......};EXEC
SQL
CLOSE
SX;
/*關閉游標*/......二、CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途用帶游標的SELECT語句查出所有滿足條件的記錄進一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之步驟DECLARE:說明游標OPEN:打開游標,把所有滿足查詢條件的記錄從指定表取至緩沖區(qū)FETCH:推進游標指針,并把當前記錄從緩沖區(qū)中取出來送至主變量檢查該記錄是否是要修改或刪除的記錄,是則處理之重復第(3)和(4)步,用逐條取出結果集中的行進行判斷和理CLOSE:關閉游標,釋放結果集占用的緩沖區(qū)和其他資源說明游標:為UPDATE語句說明游標EXEC
SQL
DECLARE<游標名>CURSOR
FOR<SELECT語句>FOR
UPDATE
OF<列名>;為DELETE語句說明游標EXEC
SQL
DECLARE<游標名>CURSOR
FOR<SELECT語句>FOR
DELETE;修改或刪除當前記錄<UPDATE語句>WHERE
CURRENT
OF<游標名><DELETE語句>WHERE
CURRENT
OF<游標名>WHERE
CURRENT
OF<游標名>子句表示修改或刪除的是該游標中最近一次取出的記錄例2:對某個系的學生信息,根據用戶的要求修改其中某些人的年齡字段。思路:查詢某個系全體學生的信息(要查詢的系名由主變量deptname指定);然后根據用戶的要求修改其中某些記錄的年齡字段......EXEC
SQL
INCLUDE
SQLCA;EXEC
SQL
BEGIN
DECLARE
SECTION;....../*說明主變量deptname,HSno,Hsname,…,NEWAge等*/......EXEC
SQL
END
DECLARE
SECTION;......gets(deptname);
/*為主變量deptname賦值*/......EXEC
SQL
DECLARE
SX
CURSOR
FORSELECT
Sno,
Sname,
Ssex,
SageFROM
StudentWHERE
SDept=:deptnameFOR
UPDATE
OF
Sage;/*說明游標*/EXEC
SQL
OPEN
SX/*打開游標*WHILE(1){
/*用循環(huán)結構逐條處理結果集中的記錄*EXEC
SQL
FETCH
SX
INTO
:HSno,
:HSname,
:HSsex,
:HSif
(sqlca.sqlcode
<>
SUCCESS)break;/*若所有查詢結果均已處理完或出現SQL語句錯誤,則退出循環(huán)*/printf("%s,
%s,
%s,
%d",
Sno,
Sname,
Ssex,
Sage);/*顯示該記錄*/printf("UPDATE
AGE?");
/*問用戶是否要修改*scanf("%c",&yn);if
(yn="y"
or
yn="Y"){printf("INPUT
NEW
AGE:
");scanf("%d",&NEWAge);/*需要修改*//*輸入新的年齡值*/EXEC
SQL
UPDATE
StudentSET
Sage=:NEWAgeWHERE
CURRENT
OF
SX;/*修改當前記錄的年齡字段*/};};EXEC
SQL
CLOSE
SX;...
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年氣割工具項目可行性研究報告
- 2024至2030年中國塑鋼開口鏈行業(yè)投資前景及策略咨詢研究報告
- 課程設計簡單ftp功能模擬
- 廣西大學鋼混課程設計
- 中國高壓熱縮管行業(yè)市場現狀分析及競爭格局與投資發(fā)展研究報告(2024-2030版)
- 中國鋅精礦市場供需態(tài)勢及競爭策略分析研究報告(2024-2030版)
- 2024年中國消炎膏市場調查研究報告
- 中國自動化液體處理設備行業(yè)現狀動態(tài)與發(fā)展趨勢預測研究報告(2024-2030版)
- 2024年中國條鎖市場調查研究報告
- 中國礦物質補充劑行業(yè)競爭格局及需求規(guī)模預測研究報告(2024-2030版)
- 2024年永州職業(yè)技術學院單招職業(yè)技能測試題庫及答案解析
- 注射相關感染預防與控制(全文)
- 《紅星照耀中國》閱讀推進課教學設計-2023-2024學年統(tǒng)編版語文八年級上冊
- TSG+11-2020鍋爐安全技術規(guī)程
- NB-T31030-2012陸地和海上風電場工程地質勘察規(guī)范
- 國開(黑龍江)2024年《網絡行為分析》終結性考核答案
- 江蘇省常州市天寧區(qū)2023-2024學年五年級下學期一二單元語文試卷
- 學生自主管理委員會常規(guī)檢查登記表(定)
- DL-T5142-2012火力發(fā)電廠除灰設計技術規(guī)程
- 江蘇省南京市鼓樓區(qū)+2023-2024學年九年級上學期期中物理試題(有答案)
- 老年友善醫(yī)院創(chuàng)建匯報
評論
0/150
提交評論