




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第八章數據庫編程8.1
嵌入式SQL8.2存儲過程8.3ODBC編程8.4JDBC8.5ADO簡介8.1嵌入式SQLSQL語言提供了兩種不同的使用方式:交互式嵌入式將SQL語句嵌入到其它宿主語言編寫的程序中,作為宿主語言的子語言,使宿主語言具備訪問數據庫的能力。宿主語言:COBOL,C,Pascal,Fortran,VC++,VB,DEPHI,CB等能嵌入SQL語句的高級語言。宿主語言本身不能直接識別SQL語句。
為什么要引入嵌入式SQLSQL語言是非過程性語言事務處理應用需要高級語言這兩種方式細節上有差別,在程序設計的環境下,SQL語句要做某些必要的擴充。把SQL嵌入到其他高級語言中,必須解決的三個問題:語句識別——如何區分SQL語句和主語言語句。數據交換——由主語言提出的操作或數據,如何讓數據庫管理系統執行,由數據庫查詢出的數據如何交由主語言處理。協調主語言的單記錄操作和數據庫的集合操作。8.1.1嵌入式SQL的處理過程對宿主型數據庫語言SQL(ESQL),DBMS采用預編譯方法處理:
1.由DBMS的預處理程序對源程序進行掃描,識別出SQL語句
2.把它們轉換成主語言調用語句,以使主語言編譯程序能識別它
3.最后由主語言的編譯程序將整個源程序編譯成目標碼。主語言程序含ESQL語句ESQL語句轉換為函數調用目標語言程序RDBMS的預處理程序主語言編譯程序ESQL基本處理過程8.1.1嵌入式SQL的處理過程為了能夠區分SQL語句與主語言語句,所有的SQL語句必需要有前綴EXECSQL,以(;)結束,嵌入式SQL語句的一般形式
EXECSQL<SQL語句>;例:EXECSQLDROPTABLEStudent;8.1.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句。SQL語句描述性的面向集合的語句負責操縱數據庫高級語言語句過程性的面向記錄的語句負責控制程序流程嵌入式SQL語句與主語言之間的通信主要是指:描述性面向集合與過程性面向紀錄(元組)語句之間的通信。
工作單元之間的通信方式SQL通信區向主語言傳遞SQL語句的執行狀態信息,主語言能夠據此控制程序流程。主變量
1)主語言向SQL語句提供參數。
2)將SQL語句查詢數據庫的結果交主語言進一步處理。
游標解決集合性操作語言與過程性操作語言的不匹配。一、
SQL通信區SQLCA:
SQLCommunicationArea是一個數據結構——存放狀態信息供程序讀取。SQLCA的用途SQL語句執行后,DBMS反饋給應用程序信息描述系統當前工作狀態描述運行環境這些信息將送到SQL通信區SQLCA中,應用程序從SQLCA中取出這些狀態信息,據此決定接下來執行的語句定義SQLCA
用EXECSQLINCLUDESQLCA加以定義使用SQLCASQLCA中有一個存放每次執行SQL語句后返回代碼的變量SQLCODE
;如果SQLCODE等于預定義的常量SUCCESS,則表示SQL語句成功,否則在SQLCODE存放錯誤代碼;應用程序每執行完一條SQL語句之后都應該測試一下SQLCODE的值,以了解該SQL語句執行情況并做相應處理。二、
主變量什么是主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數據,在SQL語句中使用的主語言程序變量簡稱為主變量(HostVariable)主變量的類型輸入主變量---由應用程序對其賦值,SQL語句引用。輸出主變量--由SQL語句賦值或設置狀態信息,返回給應用程序。一個主變量有可能既是輸入主變量又是輸出主變量定義SQLCA
用EXECSQLINCLUDESQLCA加以定義使用SQLCASQLCA中有一個存放每次執行SQL語句后返回代碼的變量SQLCODE;如果SQLCODE等于預定義的常量SUCCESS,則表示SQL語句成功,否則在SQLCODE
存放錯誤代碼;應用程序每執行完一條SQL語句之后都應該測試一下SQLCODE的值,以了解該SQL語句執行情況并做相應處理。指示變量一個主變量可以附帶一個指示變量(IndicatorVariable)什么是指示變量整型變量用來“指示”所指主變量的值或條件。指示變量的用途指示變量可以輸入主變量是否為空值指示變量可以檢測輸出主變量是否為空值,值是否被截斷。在SQL語句中使用主變量和指示變量的方法1)說明主變量和指示變量BEGINDECLARESECTION ......... .........(說明主變量和指示變量)
ENDDECLARESECTION2)使用主變量說明之后的主變量可以在SQL語句中任何一個能夠使用表達式的地方出現。為了與數據庫對象名(表名、視圖名、列名等)區別,SQL語句中的主變量名前要加冒號(:)作為標志3)使用指示變量指示變量前也必須加冒號標志必須緊跟在所指主變量之后在SQL語句之外(主語言語句中)使用主變量和指示變量的方法:可以直接引用,不必加冒號。三、游標(cursor)1、為什么要使用游標SQL語言與主語言具有不同數據處理方式SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應用程序輸出數據的要求嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式2、什么是游標游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果每個游標區都有一個名字用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理。四、
建立和關閉數據庫連接1、建立數據庫連接嵌入式SQL要訪問數據庫必須先連接數據庫,DBMS根據用戶信息對連接請求進行合法性驗證,只有通過了身份驗證,才能建立一個可用的合法連接。其語句是:EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];Target:是連接數據庫的數據庫服務器,它可以是一個常見的服務器,或是包含服務器標識的SQL串常量,也可以是DEFAULT。connection-name:是可選擇的連接名,連接必須是一個有效標識符,主要用來標識整個程序內同時建立多個連接,如果整個程序中只有一個連接也可以不指定連接名。如果程序運行過程中建立了多個連接,執行所有的數據庫單元的工作都在該操作提交時所選擇的當前連接上。程序運行過程中可以修改當前連接,對應的嵌入式SQL語句是:EXECSQLSETCONNECTTOconnection-name|DEFAULT2、關閉數據庫連接當某個連接上的所有數據庫操作完成后,應用程序應該主動釋放所占用的連接資源。EXECSQLDISCONNECT[connection];connection:是EXECSQLCONNECT所建立的數據庫連接五、程序實例[例1]:依次檢查某個系學生的記錄,交互式更新某些學生的年齡。EXECSQLBEGINDECLARESECTION;/*說明主變量*/
CHARdeptname(20);CHARHSno(9);CHARHSname(20);CHARHSeex(2);INTHSage;INTNEWAGE;EXECSQLENDDECLARESECTION;LongSQLCODE;EXECSQLINCLUDESQLCA;/*定義SQL通信區*/main(void){intcount=0;charyn;
printf(“Pleasechoosethedepartmentname(CS/MA/IS):”);
scanf(“%s”,&deptname);EXECSQLCONNECTTOTEST@localhost:54321USER”SYSTEM”/”MANAGER”;
EXECSQLDECLARESXCURSORFOR/*定義游標SX*/SELECTSno,Sname,Seex,Sage
/*SX對應的語句*/FROMStudentWHERESdept=:deptname;
EXECSQLOPENSX;
/*打開游標SX,指向查詢結果的第一行*/
for(;;){EXECSQLFETCHSXINTO:Hsno,:Hsname,:Hseex,:HSage;
/*將當前數據放入主變量并推進游標指針*/if(sqlca.sqlcode<>SUCCESS)
/*利用SQLCA中的狀態信息決定何時退出循環*/break;if(count++==0)
printf(“\n%-10s%-20s%-10s,%10s\n”,
“Sno”,“Sname”,“Ssex”,“Sage”);
/*如果是第一行,則打印行頭*/
printf("%-10s%-20s%-10s,%-10d",
Sno,Sname,Ssex,Sage);/*顯示該記錄*/
printf("UPDATEAGE(y/n)?");/*問用戶是否要修改*/
Do{scanf("%c",&yn);}
While(yn!='n'&&yn!=‘N'&&yn!=‘y'&&yn!=‘Y');if(yn=‘y’||yn=‘Y’)/*需要修改*/
{printf("INPUTNEWAGE:");
scanf("%d",&NEWAge);/*輸入新的年齡值*/
EXECSQLUPDATEStudentSETSage=:NEWAgeWHERECURRENTOFSX;}/*修改當前記錄的年齡字段*/}EXECSQLCLOSESX;
/*關閉游標*/
EXECSQLCOMMITWORK/*提交更新*/EXECSQLDISCONNECTTEST/*斷開數據庫連接*/}8.1.3不用游標的SQL語句不用游標的SQL語句的種類說明性語句數據定義語句數據控制語句查詢結果為單記錄的SELECT語句非CURRENT形式的UPDATE語句非CURRENT形式的DELETE語句
INSERT語句一、說明性語句說明性語句是專為在嵌入式SQL中說明主變量、SQLCA等而設置的。說明主變量1.EXECSQLBEGINDECLARESECTION;2.EXECSQLENDDECLARESECTION;這兩條語句必須配對出現,相當于一個括號,兩條語句中間是主變量的說明說明SQLCA3.EXECSQLINCLUDESQLCA二、數據定義語句例[2]建立一個“學生”表Student
EXECSQLCREATETABLEStudent(SnoCHAR(5)NOTNULLUNIQUE,
SnameCHAR(20),
SsexCHAR(1),SageINT,
SdeptCHAR(15));注:數據定義語句中不允許使用主變量例:下列語句是錯誤的
EXECSQLDROP TABLE:table_name;三、數據控制語句例[3]把查詢Student表權限授給用戶U1
EXECSQLGRANTSELECTONTABLEStudentTOU1;四、查詢結果為單記錄的SELECT語句語句格式EXECSQLSELECT[ALL|DISTINCT]<目標列表達式>[,<目標列表達式>]...
INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...FROM<表名或視圖名>[,<表名或視圖名>]...[WHERE<條件表達式>][GROUPBY<列名1>[HAVING<條件表達式>]][ORDERBY<列名2>[ASC|DESC]];對交互式SELECT語句的擴充就是多了一個INTO子句。把從數據庫中找到的符合條件的記錄,放到INTO子句指出的主變量中去。
使用注意事項
1.使用主變量
INTO子句
WHERE子句的條件表達式
HAVING短語的條件表達式2.使用指示變量指示變量只能用于INTO子句中如果INTO子句中主變量后面跟有指示變量,則當查詢得出的某個數據項為空值時,系統會自動將相應主變量后面的指示變量置為負值,但不向該主變量執行賦值操作,即主變量值仍保持執行SQL語句之前的值當發現指示變量值為負值時,不管主變量為何值,均應認為主變量值為NULL3.查詢結果為空集如果數據庫中沒有滿足條件的記錄,即查詢結果為空,則DBMS將SQLCODE的值置為1004.查詢結果為多條記錄程序出錯,DBMS會在SQLCA中返回錯誤信息例[4]根據學生號碼查詢學生信息。假設已將要查詢的學生的學號賦給了主變量givensnoEXECSQLSELECTSno,Sname,Ssex,Sage,SdeptINTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;Hsno,Hname,Hsex,Hage,Hdept和givensno均是主變量,并均已在前面的程序中說明過了。例[5]查詢某個學生選修某門課程的成績。假設已將要查詢的學生的學號賦給了主變量givensno,將課程號賦給了主變量givencno。
EXECSQLSELECTSno,Cno,GradeINTO:Hsno,:Hcno,:Hgrade:GradeidFROMSCWHERESno=:givensnoAND
Cno=:givencno;從提高應用程序的數據獨立性角度考慮,SELECT語句在任何情況下都應該使用游標對于僅返回一行結果數據的SELECT語句雖然可以不使用游標但如果以后數據庫改變了,該SELECT語句可能會返回多行數據,這時該語句就會出錯五、非CURRENT形式的增刪改語句非CURRENT形式的UPDATE語句使用主變量
SET子句
WHERE子句使用指示變量
SET子句非CURRENT形式的UPDATE語句可以操作多條元組例[6]修改某個學生1號課程的成績。假設該學生的學號已賦給主變量givensno,修改后的成績已賦給主變量newgrade。
EXECSQLUPDATESCSETGrade=:newgradeWHERESno=:givensno
and
Cno='1';例[7]將計算機系全體學生年齡置NULL值
Sageid=-1;EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept='CS';將指示變量Sageid賦一個負值后,無論主變量Raise為何值,DBMS都會將CS系所有記錄的年齡屬性置空值。它等價于:
EXECSQLUPDATEStudentSETSage=NULLWHERESdept='CS';例[8]某個學生退學了,現要將有關他的所有選課記錄刪除掉。假設該學生的姓名已賦給主變量stdname
EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);例[9]某個學生新選修了某門課程,將有關記錄插入SC表假設學生的學號已賦給主變量stdno,課程號已賦給主變量couno。
gradeid=-1;EXECSQLINSERTINTOSC(Sno,Cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);由于該學生剛選修課程,尚未考試,因此成績列為空。所以本例中用指示變量指示相應的主變量為空值。8.1.4使用游標的SQL語句必須使用游標的SQL語句查詢結果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句一、查詢結果為多條記錄的SELECT語句使用游標的步驟:1.說明游標2.打開游標3.移動游標指針,然后取當前記錄4.關閉游標1.說明游標語句格式
EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>;功能:是一條說明性語句,這時DBMS并不執行SELECT指定的查詢操作。2.打開游標語句格式
EXECSQLOPEN<游標名>;功能:打開游標實際上是執行相應的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區中,這時游標處于活動狀態,指針指向查詢結果集中第一條記錄之前。3.移動游標指針,然后取當前記錄語句格式EXECSQLFETCH[[NEXT|PRIOR|FIRST|LAST]FROM]<游標名>
INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;功能:指定方向推動游標指針,然后將緩沖區中的當前記錄取出來送至主變量供主語言進一步處理。
NEXT|PRIOR|FIRST|LAST:指定推動游標指針的方式。NEXT:向前推進一條記錄(缺省值)PRIOR:向回退一條記錄FIRST:推向第一條記錄LAST:推向最后一條記錄說明(1)主變量必須與SELECT語句中的目標列表達式具有一一對應關系(2)FETCH語句通常用在一個循環結構中,通過循環執行FETCH語句逐條取出結果集中的行進行處理(3)為進一步方便用戶處理數據,現在一些關系數據庫管理系統對FETCH語句做了擴充,允許用戶向任意方向以任意步長移動游標指針。4.關閉游標語句格式
EXECSQLCLOSE<游標名>;功能關閉游標,釋放結果及占用的緩沖區及其他資源。說明游標被關閉后,就不再和原來的查詢結果集相聯系被關閉的游標可以再次被打開,與新的查詢結果相聯系。二、CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途.CURRENT形式的UPDATE語句和DELETE語句面向集合的操作;
一次修改或刪除所有滿足條件的記錄.如果只想修改或刪除其中某個記錄;用帶游標的SELECT語句查出所有滿足條件的記錄;從中進一步找出要修改或刪除的記錄;用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之。步驟(1)DECLARE說明游標(2)OPEN
打開游標,把所有滿足查詢條件的記錄從指定表取至緩沖區(3)FETCH推進游標指針,并把當前記錄從緩沖區中取出來送至主變量(4)檢查該記錄是否是要修改或刪除的記錄,是則處理之(5)重復第(3)和(4)步,用逐條取出結果集中的行進行判斷和處理(6)CLOSE
關閉游標,釋放結果集占用的緩沖區和其他資源說明游標為UPDATE語句說明游標語句格式
EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>FORUPDATEOF<列名>;說明:
FORUPDATEOF<列名>短語用于指明檢索出的數據在指定列上是可修改的,以便DBMS進行并發控制為DELETE語句說明游標語句格式
EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>FORUPDATE;說明:FORUPDATE短語提示DBMS進行并發控制修改或刪除當前記錄經檢查緩沖區中記錄是要修改或刪除的記錄,則用UPDATE語句或DELETE語句修改或刪除該記錄語句格式<UPDATE語句>WHERECURRENTOF<游標名><DELETE語句>WHERECURRENTOF<游標名>WHERECURRENTOF<游標名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司清明節踏青活動方案
- 公司茶室聚會活動方案
- 公司文化集市活動方案
- 公司社團迎新活動方案
- 公司老板過生日策劃方案
- 公司歌唱祖國活動方案
- 公司改進策劃方案
- 公司職業健康年活動方案
- 公司烤全羊聚餐活動方案
- 公司教職工秋游活動方案
- DB12-T 1153-2022 城市軌道交通運營設備設施大修和更新改造技術規范
- 北京市海淀區2023-2024學年八年級下學期期末考試語文試卷(含答案)
- 叉車裝卸搬運合同協議書
- 突發事件應對法考試題庫
- 公司勞務合同范本2018
- DL∕T 1753-2017 配網設備檢修試驗規程
- 寄生蟲病防治技能競賽試題及答案
- 中興智慧園區智能停車解決方案
- 陜西省西安市西光中學2025屆高一化學第二學期期末考試試題含解析
- 期末專題復習專題04 修改病句(專項訓練)-2023-2024學年四年級下冊語文(統編版)
- 檢驗科實驗室生物安全
評論
0/150
提交評論