




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章過程式對象程序設計一、選擇題1.下列說法錯誤的是()。A.語句體包含一個以上語句需要采用BEGIN…ENDB.多重分支只能用CASE語句C.WHILE中循環體可以一次不執行D.注釋內容不會產生任何動作2.關于存儲過程的說法,說法錯誤的是()。A.方便用戶完成某些功能B.存儲過程方便用戶批量執行-SQL命令C.存儲過程不能調用存儲過程D.應用程序可以調用存儲過程3.存儲過程與外界的交互不能通過()。A.表 B.輸入參數 C.輸出參數 D.游標4.關于存儲函數,說法錯誤的是()。A.函數值只能一個 B.不能采用事務C.不能包含輸出參數 D.不能使用用戶變量5.關于游標,說法錯誤的是()。A.游標用于處理多條記錄 B.一次只能讀取一條記錄C.只能順序讀取 D.游標定義不能保存6.關于事務,說法錯誤的是()。A.事務一般用于一條以上增刪改語句中 B.回滾后事務中記錄的變化均不會發生C.必須關閉自動提交 D.同一個事務中不同查詢的相同項可能檢索到不同的結果7.關于觸發器的錯誤說法是()。A.INSERT觸發器先插入記錄后判斷 B.DELETE觸發器先刪除記錄后判斷C.UPDATE觸發器先判斷后修改記錄 D.A和B8.關于觸發器的錯誤說法是()。A.游標一般用于存儲過程 B.游標也可用于觸發器C.應用程序可以調用觸發器 D.觸發器一般針對表二、說明題1.為什么需要使用存儲過程和存儲函數?2.存儲函數和存儲過程有什么不同,它們分別應用在什么場合?3.為什么需要錯誤處理?什么情況下需要拋出錯誤信息?4.如何指定存儲函數和存儲過程調用者?5.加鎖后是否不需要事務?6.事務處理和錯誤處理功能有什么不同?7.什么是幻讀?什么是MVCC?8.為什么需要使用觸發器?。9.為什么需要使用事件?定義的事件是否一定保存?三、編程題(基于xscj數據庫)1.創建存儲過程proc_area,計算三角形面積。輸入參數為三邊長(a,b,c),輸出參數為三角形面積。調用存儲過程,顯示計算結果。2.創建存儲函數func_area,計算三角形面積。輸入參數為三邊長(a,b,c),函數返回為三角形面積。調用存儲函數,顯示計算結果。邊長小于等于0,返回NULL。3.編寫插入成績表(cj)記錄存儲過程CJ_INSERT,輸入參數為學號、課程號、成績,輸出參數為狀態。如果對應學號和課程號存在,返回狀態0,否則進行插入操作。包括:(1)查找課程表(kc)對應該課程的學分,如果找不到該課程,課程號輸入參數錯誤,狀態為-11。(2)查找學生表(xs)對應學號,如果找不到該學號,學號輸入參數錯誤,狀態為-12。(3)如果輸入參數正確,用輸入參數對成績表(cj)插入記錄,同時更新(累加)學號對應記錄總學分,返回狀態1。插入操作需要采用事務,如果事務操作不成功,狀態為-1。4.編寫修改成績表(cj)記錄存儲過程CJ_UPDATE,輸入參數為學號、課程號、成績,輸出參數為狀態。如果對應學號和課程號不存在,調用插入成績表(cj)記錄存儲過程CJ_INSERT,將CJ_INSERT存儲過程返回狀態作為本存儲過程狀態返回。否則進行修改操作。包括:(1)讀取課程表(kc)對應課程的學分。(2)如果原來成績和新成績均>=60或者均<60,修改成績表對應成績。返回狀態1。(3)如果原來成績>=60而新成績<60,修改成績表對應成績,同時學生表(xs)總學分減該課程學分。返回狀態1。(4)如果原來成績<60而新成績>=60,修改成績表對應成績,同時學生表(xs)總學分加該課程學分。返回狀態1。修改操作需要采用事務,如果事務操作不成功,狀態為-1。5.創建通過游標實現學生表(xs)總學分初始化存儲過程XS_ZXF_RESET。輸入參數為學號,輸出參數為狀態。成績表(cj)對應學號查詢定義作為游標,學生表(xs)對應學號學生記錄加鎖,總學分置0,循環讀取游標記錄,根據成績,讀取對應課程學分,累加學生表(xs)學號記錄總學分。循環完成后,學生表(xs)對應學號學生記錄解鎖。6.創建學生表(xs)刪除觸發器,判斷成績表(cj)是否存在對應的學號記錄,如果存在,發出錯誤信號,阻止學生表(xs)刪除操作。參考答案習題-第09章一、選擇題 1.B 2.C 3.D 4.D 5.D 6.D 7.D 8.C二、說明題 1.存儲過程和存儲函數在服務器端運行、執行速度快,其執行一次后,執行規劃就駐留在高速緩沖存儲器,以后操作只需從高速緩存中調用已編譯好的二進制代碼,提高了系統性能。另外,使用存儲過程和存儲函數可以完成所有數據庫操作,并可通過編程方式控制上述操作對數據庫信息訪問的權限,確保數據庫安全。 2.存儲函數與存儲過程的區別:(1)存儲函數不能擁有輸出參數,因為存儲函數本身就是輸出參數;(2)不能用CALL語句來調用存儲函數;(3)存儲函數必須包含一條RETURN語句,而這條特殊的SQL語句不允許包含于存儲過程中。存儲函數多用于輔助數據庫操作(如克服生成列的局限性),但MySQL的存儲函數并不支持使用顯示或隱式事務,所以涉及基本表的更新操作一般不要采用存儲函數實現,而是用存儲過程結合事務的方法來保證更新數據的一致和完備性。 3.MySQL程序中處理SQL語句可能會出錯,導致系統停止對程序的處理,使用錯誤處理功能可以為不同的錯誤定義不同的處理程序,讓系統根據條件自動處理。在實際應用中有時需要根據情況主動向MySQL系統提供信號,以便服務器向處理程序、客戶端提供當前數據庫操作情況信息,這個時候就需要拋出錯誤信息。 4.存儲過程創建好后,可以在應用程序、觸發器或者其他存儲過程中通過“CALL存儲過程名(參數,...)”調用;而存儲函數創建好后,就如同系統提供的內置函數一樣可供隨時調用使用,調用語句為“存儲函數名([參數,...])”,調用存儲函數的方式與調用存儲過程相比,更加靈活多樣。存儲過程只能采用CALL語句直接調用,而存儲函數則可以出現在各種語句中。 5.仍然需要事務的,因為加鎖解決并發問題,而事務解決多語句操作記錄的完整性。 6.事務處理是將一系列不可分割的增刪改查操作放在同一個事務中執行以確保數據完整一致性,發生錯誤失敗時事務會回滾,不會對數據庫造成任何影響;而錯誤處理則是在出錯時根據錯誤類型和返回碼預先定義處理程序,發生錯誤時由MySQL自動執行處理程序,而錯誤所造成對數據的影響仍然是作用在數據庫上的,只不過通過執行錯誤處理程序可以加以彌補和善后,并提示用戶發生錯誤的原因以便排查。 7.幻讀(PhantomRead)是當一個事務對某行執行插入或刪除操作,而該行屬于某個事務正在讀取的行的范圍時發生的問題。事務第一次讀的行范圍顯示出其中一行已不復存在于第二次讀或后續讀中,因為該行已被其他事務刪除。同樣,由于其他事務的插入操作,事務的第二次讀或后續讀顯示有一行已不存在于原始讀中。 MVCC(MultiversionConcurrencyControl),即多版本并發控制技術。它通過數據行的多個版本管理來實現數據庫的并發控制,簡單來說就是保存數據的歷史版本。可以通過比較版本號決定數據是否顯示。讀取數據的時候不需要加鎖可以保證事務的隔離效果。 8.觸發器與表的關系密切,用于保護表中的數據。當有操作影響到觸發器保護的數據時,觸發器自動執行,例如,通過觸發器實現多個表間數據的一致性。當對表執行INSERT、DELETE或UPDATE操作時,將激活觸發器。 9.事件的主要作用是:關閉賬戶;打開或關閉數據庫指示器;使數據庫中的數據在某個間隔后刷新;執行對進入數據的復雜的檢查工作。定義的事件會被作為數據庫對象保存在系統中,在設定的時刻被啟動運行。三、編程題1.存儲過程proc_area計算三角形面積,執行語句:USEmydb;DROPPROCEDUREIFEXISTSproc_area;CREATEPROCEDUREproc_area(INaint(1),INbint(1),INcint(1),OUTareafloat)BEGIN SETarea=(1/4)*SQRT((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a));END;SET@a=3;SET@b=4;SET@c=5;CALLproc_area(@a,@b,@c,@area);SELECTFORMAT(@area,2)AS'三角形面積';2.存儲函數func_area計算三角形面積,執行語句:SETGLOBALlog_bin_trust_function_creators=1;USEmydb;DROPFUNCTIONIFEXISTSfunc_area;CREATEFUNCTIONfunc_area(aint(1),bint(1),cint(1)) RETURNSfloatBEGIN DECLAREareafloat; IFa<=0ORb<=0ORc<=0THEN RETURNNULL; ENDIF; SETarea=(1/4)*SQRT((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)); RETURNarea;END;SET@a=3;SET@b=4;SET@c=5;SELECTFORMAT(func_area(@a,@b,@c),2)AS'三角形面積';3.編寫插入成績表(cj)記錄存儲過程CJ_INSERT,執行語句:USExscj;CREATEPROCEDURECJ_INSERT(INsidchar(6),INcidchar(3),INscoreint,OUTCodeint)label:BEGIN DECLARExfint(1)DEFAULTNULL; DECLARExhchar(6)DEFAULTNULL; DECLAREtransErrintDEFAULT0; DECLARECONTINUEHANDLERFORSQLEXCEPTIONSETtransErr=1; SETCode=0; SELECT學分INTOxfFROMkc WHERE課程號=cid; IFxfISNULLTHEN SETCode=-11; LEAVElabel; ENDIF; SELECT學號INTOxhFROMxs WHERE學號=sid; IFxhISNULLTHEN SETCode=-12; LEAVElabel; ENDIF; STARTTRANSACTION; INSERTINTOcj(學號,課程號,成績) VALUES(sid,cid,score); UPDATExsSET總學分=總學分+xf WHERE學號=xh; IFtransErr=1THEN ROLLBACK; SETCode=-1; ELSE COMMITWORK; SETCode=1; ENDIF;END;測試執行語句:CALLCJ_INSERT('081102','100',99,@code);SELECT@code;CALLCJ_INSERT('091102','101',99,@code);SELECT@code;CALLCJ_INSERT('081102','101',99,@code);SELECT@code;4.編寫修改成績表(cj)記錄存儲過程CJ_UPDATE,執行語句:USExscj;CREATEPROCEDURECJ_UPDATE(INsidchar(6),INcidchar(3),INscoreint,OUTCodeint)label:BEGIN DECLARExfint(1)DEFAULTNULL; DECLARExhchar(6)DEFAULTNULL; DECLAREcjint(1)DEFAULTNULL; DECLAREcodeint(1)DEFAULT0; DECLAREtransErrintDEFAULT0; DECLARECONTINUEHANDLERFORSQLEXCEPTIONSETtransErr=1; SETCode=0; SELECT學分INTOxfFROMkc WHERE課程號=cid; IFxfISNULLTHEN CALLCJ_INSERT(sid,cid,score,@code); SELECT@codeINTOcode; SETCode=code; LEAVElabel; ENDIF; SELECT學號INTOxhFROMxs WHERE學號=sid; IFxhISNULLTHEN CALLCJ_INSERT(sid,cid,score,@code); SELECT@codeINTOcode; SETCode=code; LEAVElabel; ENDIF; SELECT成績INTOcjFROMcj WHERE學號=sidAND課程號=cid; STARTTRANSACTION; IF(cj>=60ANDscore>=60)OR(cj<60ANDscore<60)THEN UPDATEcjSET成績=score WHERE學號=sidAND課程號=cid; ENDIF; IFcj>=60ANDscore<60THEN UPDATEcjSET成績=score WHERE學號=sidAND課程號=cid; UPDATExsSET總學分=總學分-xf WHERE學號=xh; ENDIF; IFcj<60ANDscore>=60THEN UPDATEcjSET成績=score WHERE學號=sidAND課程號=cid; UPDATExsSET總學分=總學分+xf WHERE學號=xh; ENDIF; IFtransErr=1THEN ROLLBACK; SETCode=-1; ELSE COMMITWORK; SETCode=1; ENDIF;END;測試執行語句:CALLCJ_UPDATE('081102','101',95,@code);CALLCJ_UPDATE('081102','101',59,@code);CALLCJ_UPDATE('081102','101',90,@code);5.創建通過游標實現學生表(xs)總學分初始化存儲過程XS_ZXF_RESET,執行語句:USExscj;CREATEPROCEDUREXS_ZXF_RESET(INsidchar(6),OUTCodeint)label:BEGIN DECLARExhchar(6)DEFAULTNULL; DECLAREkchchar(3)DEFAULTNULL; DECLARExfint(1)DEFAULTNULL; DECLAREcjint(1)DEFAULTNULL; DECLAREmyfoundbooleanDEFAULTtrue; DECLAREtransErrintDEFAULT0; DECLAREcur_cjCURSOR FOR SELECT課程號,成績FROMcjWHERE學號=sid; DECLARECONTINUEHANDLERFORNOTFOUND SETmyfound=false; DECLARECONTINUEHANDLERFORSQLEXCEPTIONSETtransErr=1; SETCode=0; SELECTDISTINCT(學號)INTOxhFROMcj WHERE學號=sid; IFxhISNULLTHEN SETCode=-12; LEAVElabel; ENDIF; STARTTRANSACTION; SELECT*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025南航招聘考試完整試題及答案
- 思維訓練的幼兒園數學試題與答案
- 2025東航招聘英語試題及答案
- 失眠藥物治療試題及答案
- 藝術市場數字化交易平臺在藝術品市場交易市場開發中的應用報告
- 廣西區考申論試題及答案
- 節奏與旋律相互影響的探索試題及答案
- 知曉創業扶持政策試題及答案
- 城市供水設施建設風險分析報告:2025年社會穩定風險評估與政策建議
- 物理實驗中數據處理與分析試題及答案
- 功能材料概論-課件
- XX單線鐵路隧道施工設計
- 葉曼講《道德經》講義第1~10章
- 地下車庫地坪施工工藝工法標準
- 生物化學工程基礎(第三章代謝作用與發酵)課件
- 國家開放大學一網一平臺電大《可編程控制器應用實訓》形考任務1-7終結性考試題庫及答案
- 農村戶口分戶協議書(6篇)
- (部編版一年級下冊)語文第七單元復習課件
- SQ-02-綠色食品種植產品調查表0308
- 麗聲北極星分級繪本第二級上Dinner for a Dragon 教學設計
- 活躍氣氛的開場小游戲「培訓破冰前必備」
評論
0/150
提交評論