版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第八講數(shù)據(jù)庫編程沈明玉數(shù)據(jù)庫編程一、嵌入式SQL二、PL/SQL與Transact-SQL三、存儲過程四、事務的概念與使用數(shù)據(jù)庫編程一、嵌入式SQL嵌入式SQL什么是嵌入式SQL?
交互式SQL和嵌入式SQL是SQL的兩種使用方法。當一個程序既要訪問數(shù)據(jù)庫,又要處理數(shù)據(jù)時,將SQL語言嵌入到程序設計語言(宿主語言)中,將SQL語言訪問數(shù)據(jù)庫的功能和宿主語言的數(shù)據(jù)處理功能相結合,這種使用SQL的方法稱為嵌入式SQL。嵌入式SQL(續(xù))如何實現(xiàn)嵌入式SQL?宿主語言的編譯器不能識別SQL,如何將嵌有SQL語句的宿主語言編譯成可執(zhí)行代碼?宿主語言與DBMS之間如何傳遞數(shù)據(jù)和信息?如何解決元組集合數(shù)據(jù)對宿主語言變量的賦值?在宿主語言中標注SQL語句的方法用EXECSQL前綴來標識SQL語句,以區(qū)分宿主語言與SQL語言。嵌入式SQL(續(xù))嵌入式SQL的處理過程嵌入式SQL(續(xù))宿主語言與DBMS之間如何通信?SQL通信區(qū)(SQLCA)SQLCA是一個數(shù)據(jù)結構SQLCA的用途描述系統(tǒng)當前工作狀態(tài)描述運行環(huán)境SQLCA使用方法定義SQLCA:ExecSQLIncludeSQLCA使用SQLCA:變量SQLCODE,為0-執(zhí)行成功,否則表示出錯。嵌入式SQL(續(xù))共享變量(主變量)宿主語言與SQL語言之間通過共享變量進行數(shù)據(jù)傳送;共享變量由宿主語言程序定義,用SQL的Declare說明后可在SQL語句中引用(引用時需加':'號,以區(qū)分數(shù)據(jù)庫自身的變量,如:屬性)。嵌入式SQL(續(xù))嵌入式SQL的實現(xiàn)方法說明部分定義共享變量、環(huán)境變量、游標等。ExecSQLBeginDeclareSection;charsno[10],sname[20];intsage;ExecSQLEndDeclareSection;嵌入式SQL(續(xù))執(zhí)行部分:各種SQL語句的執(zhí)行ExecSQLInsertintoStudents(sno,sname,sage)values(:sno,:sname,:sage);ExecSQLUpdateStudentsSETsname=:sname,sage=:sageWheresno=:sno;ExecSQLDeletefromSCWheresno=(SelectsnofromStudentWheresno=:sno);ExecSQLSelectsname,sageinto:sname,:sagefromStudentsWheresno=:sno;嵌入式SQL(續(xù))使用游標(cursor)的SQL編程解決多對一的問題!說明游標語句:ExecSQLDeclare<游標名>CursorforSelect…from…Where…;打開游標語句:ExecSQLOpen<游標名>;推進游標語句:ExecSQLFetch<游標名>into<變量表>;關閉游標語句:ExecSQLClose<游標名>;嵌入式SQL(續(xù))建立數(shù)據(jù)庫連接
ExecSQLConnectTOtarget[ASconnection-name][Useruser-name];
target是要連接的數(shù)據(jù)庫服務器:常見的服務器標識串,如<dbname>@<hostname>:<port>connect-name是可選的連接名,連接必須是一個有效的標識符在整個程序內(nèi)只有一個連接時可以不指定連接名。嵌入式SQL(續(xù))關閉數(shù)據(jù)庫連接
ExecSQLDisconnect[connection];程序運行過程中可以修改當前連接 ExecSQLSetConnectionconnection-name|DEFAULT;嵌入式SQL(續(xù))[例]依次檢查某個系的學生記錄,交互式更新某些學生年齡。EXECSQLBEGINDECLARESECTION;/*主變量說明開始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64]; int HSage; int NEWAGE;EXECSQLENDDECLARESECTION;/*主變量說明結束*/longSQLCODE;EXECSQLINCLUDEsqlca;/*定義SQL通信區(qū)*/嵌入式SQL(續(xù))intmain(void)/*C語言主程序開始*/{ int count=0; charyn;/*變量yn代表yes或no*/ printf("Pleasechoosethedepartmentname(CS/MA/IS):"); scanf("%s",deptname);/*為主變量deptname賦值*/ EXECSQLCONNECTTOTEST@localhost:54321USER"SYSTEM"/"MANAGER";/*連接數(shù)據(jù)庫TEST*/ EXECSQLDECLARESXCURSORFOR/*定義游標*/ SELECTSno,Sname,Ssex,Sage/*SX對應語句的執(zhí)行結果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打開游標SX便指向查詢結果的第一行*/嵌入式SQL(續(xù))for(;;) /*用循環(huán)結構逐條處理結果集中的記錄*/{ EXECSQLFETCHSXINTO:HSno,:HSname,:HSsex,:HSage; /*推進游標,將當前數(shù)據(jù)放入主變量*/ if(sqlca.sqlcode!=0)/*sqlcode!=0,表示操作不成功*/ break; /*利用SQLCA中的狀態(tài)信息決定何時退出循環(huán)*/ if(count++==0)/*如果是第一行的話,先打出行頭*/ printf("\n%-10s%-20s%-10s%-10s\n","Sno","Sname","Ssex","Sage"); printf("%-10s%-20s%-10s%-10d\n",HSno,HSname,HSsex,HSage); /*打印查詢結果*/ printf("UPDATEAGE(y/n)?");/*詢問用戶是否要更新該學生的年齡*/ do{ scanf("%c",&yn); }while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');嵌入式SQL(續(xù)) if(yn=='y'||yn=='Y')/*如果選擇更新操作*/ { printf("INPUTNEWAGE:"); scanf("%d",&NEWAGE);/*用戶輸入新年齡到主變量中*/ EXECSQLUPDATEStudent /*嵌入式SQL*/ SETSage=:NEWAGEWHERECURRENTOFSX; }/*對當前游標指向的學生年齡進行更新*/}EXECSQLCLOSESX;/*關閉游標SX不再和查詢結果對應*/ EXECSQLCOMMITWORK;/*提交更新*/ EXECSQLDISCONNECTTEST;/*斷開數(shù)據(jù)庫連接*/}數(shù)據(jù)庫編程二、PL/SQL與Transact-SQLPL/SQL與Transact-SQLPL/SQLPL/SQL是Oracle對標準SQL的過程化擴充,它將數(shù)據(jù)庫技術和過程化程序設計語言聯(lián)系起來,可使用循環(huán)、分支和嵌套,將SQL的數(shù)據(jù)操縱功能與過程化語言數(shù)據(jù)處理功能相結合。PL/SQL與Transact-SQL(續(xù))PL/SQL的作用能夠使一組SQL語句的功能更具模塊化程序特點;采用了過程性語言控制程序的結構;可以對程序中的錯誤進行自動處理,使程序能夠在遇到錯誤的時候不會被中斷;具有較好的可移植性,可以移植到另一個Oracle數(shù)據(jù)庫中;集成在數(shù)據(jù)庫中,調(diào)用更快;減少了網(wǎng)絡的交互,有助于提高程序性能。PL/SQL與Transact-SQL(續(xù))PL/SQL程序的基本結構DECLARE—可選部分變量、常量、游標、用戶定義異常的聲明……BEGIN—必要部分SQL語句和PL/SQL語句構成的執(zhí)行程序……EXCEPTION—可選部分程序出現(xiàn)異常時,捕捉異常并處理異常……END;—必須部分PL/SQL與Transact-SQL(續(xù))PL/SQL的變量簡單變量格式:變量名[constant]變量類型[notnull][default值|:=值]v_namevarchar2(10);v_ageconstantnumber:=20;v_sexchar(2)default'男';
PL/SQL與Transact-SQL(續(xù))復合變量布爾類型:v_tfboolean;type類型:
v_snostudents.sno%type;rowtype類型:v_scsc%rowtype;(使用:v_sc.sno)PL/SQL與Transact-SQL(續(xù))PL/SQL的語句賦值語句:變量名稱:=表達式v_sno:='20090080';條件語句:IF-THEN,IF-THEN-ELSE和嵌套的IF語句IF(new.Job=‘講師')AND(new.Sal<3000)THENnew.Sal:=3000;ENDIF;
PL/SQL與Transact-SQL(續(xù))分支語句:Casewhen條件表達式1then……when條件表達式nthen……else……Endcase;PL/SQL與Transact-SQL(續(xù))11循環(huán)語句:基本loop循環(huán)Loop語句1;語句2;……exit[when條件];Endloop;PL/SQL與Transact-SQL(續(xù))Forloop循環(huán):For控制變量in[reverse]下限..上限loop語句1;……語句n;Endloop;PL/SQL與Transact-SQL(續(xù))Whileloop循環(huán):While條件loop語句1;……語句n;Endloop;PL/SQL與Transact-SQL(續(xù))異常處理
EXCEPTION
WHENexception_nameTHEN
Codeforhandingexception_name;
[WHENanother_exceptionTHEN
Codeforhandinganother_exception];
[W
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 紀錄片制作合作合同
- 房屋買賣合同起草注意事項
- 物業(yè)垃圾清運服務協(xié)議
- 皮鞋購銷合同簽字生效
- 牲畜銷售合同案例分析
- 芒果批發(fā)采購合同
- 綜合采購合作協(xié)議
- 戶口轉(zhuǎn)入服務合同范例
- 建設借款合同范本
- 法律服務合同協(xié)議格式
- 山東省濟南市2023-2024學年高一上學期1月期末考試 物理 含答案
- 科研設計及研究生論文撰寫智慧樹知到期末考試答案章節(jié)答案2024年浙江中醫(yī)藥大學
- 地形對聚落及交通線路分布影響
- 合成抗菌藥醫(yī)學知識培訓培訓課件
- 部編版道德與法治五年級上冊期末試卷4
- 橋面鋪裝施工質(zhì)量控制培訓
- 醫(yī)院護理品管圈成果匯報提高24小時出入量準確率完整版本PPT易修改
- 閱讀《合作學習:實用技能、基本原則及常見問題》的體會
- T梁預制臺座占用時間及資源配置分析
- 名中醫(yī)工作室跟師醫(yī)案記錄 (15)
- 2022機要密碼工作總結機要室工作總結.doc
評論
0/150
提交評論