版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌套存儲過程陸川luchua2720第1頁,共20頁。你將了解下列內(nèi)容:什么是嵌套存儲過程如何在嵌套存儲過程間傳遞參數(shù)從嵌套存儲過程中返回值從嵌套存儲過程中返回和接收結(jié)果集如何遞歸調(diào)用存儲過程過程調(diào)用的安全性考慮第2頁,共20頁。 被調(diào)用的過程:統(tǒng)計每個雇員所完成的項目CREATE PROCEDURE count_projects ( IN p_empno CHAR(6) , out p_total INT ) LANGUAGE SQL SPECIFIC count_projects cp: BEGIN - Procedure logic SELECT COUNT(
2、*) INTO p_total FROM emp_act WHERE empno = p_empno;END cp簡單的存儲過程嵌套的例子第3頁,共20頁。調(diào)用者:根據(jù)每個雇員完成的項目的情況,決定是否給發(fā)獎金CREATE PROCEDURE bonus ( IN p_empno CHAR(6) , out p_bonus CHAR(1) ) LANGUAGE SQL SPECIFIC bonus bn: BEGIN - Declare variables DECLARE v_min INT DEFAULT 5; DECLARE v_total INT DEFAULT 0; - Procedu
3、re logic CALL count_projects(p_empno, v_total); IF ( v_total = v_min ) THEN SET p_bonus = Y; ELSE SET p_bonus = N; END IF;END bn第4頁,共20頁。傳遞參數(shù) 在存儲過程嵌套調(diào)用過程中,參數(shù)依照出現(xiàn)的次序進行傳遞,如果數(shù)據(jù)類型不匹配,請使用cast函數(shù)進行數(shù)據(jù)類型轉(zhuǎn)換;從嵌套的過程中取得返回值除了通過輸出參數(shù)獲得返回值以外,存儲過程可以通過return語句返回一個值,下面的例子演示如何通過get diagnostics語句獲得被調(diào)用過程的返回值。 下面的過程get_emp
4、_name將基于雇員編號返回雇員的first name,當找到該雇員時返回99,否則返回1000。第5頁,共20頁。CREATE PROCEDURE get_emp_name ( IN p_empno CHAR(6) , out p_fname VARCHAR(10) ) LANGUAGE SQL SPECIFIC get_emp_name gen: BEGIN - Declare variables DECLARE v_return_code INT DEFAULT 99; - Declare condition handlers DECLARE CONTINUE HANDLER FOR N
5、OT FOUND SET v_return_code = 1000; - Procedure logic SELECT firstnme INTO p_fname FROM employee WHERE empno = p_empno; RETURN v_return_code;END gen第6頁,共20頁。CREATE PROCEDURE find_emp ( IN p_empno CHAR(6) , out p_output VARCHAR(50) ) LANGUAGE SQL SPECIFIC find_emp fe: BEGIN - Declare variables DECLARE
6、 v_rc INT; DECLARE v_fname VARCHAR(15); - Procedure logic CALL get_emp_name( p_empno, v_fname ); -(1) GET DIAGNOSTICS v_rc = RETURN_STATUS; -(2) IF ( v_rc = 99 ) THEN SET p_output = The employee is: | v_fname | .; ELSEIF ( v_rc = 1000 ) THEN SET p_output = The employee does not exist!; ELSE SET p_ou
7、tput = Something else went wrong.; END IF;END fe調(diào)用者過程find_emp通過get diagnostics取得被調(diào)用者的返回值,get diagnostics必須是緊跟在call語句之后TIP:通過返回值判斷 執(zhí)行狀態(tài)第7頁,共20頁。從嵌套存儲過程返回結(jié)果集 存儲過程中的結(jié)果集可以返回給別的存儲過程,也可以返回到客戶端的應(yīng)用程序。定義游標的語法如下: declare cursor with hold with return to caller client for stmt name返回結(jié)果集到客戶端下面的過程將返回結(jié)果集到客戶端,返回的結(jié)果
8、集是特定部門下的雇員的first name、last name和salary。第8頁,共20頁。CREATE PROCEDURE to_client ( IN p_dept CHAR(3) ) LANGUAGE SQL SPECIFIC to_client DYNAMIC RESULT SETS 1tc: BEGIN - Procedure logic DECLARE v_cur CURSOR WITH RETURN TO CLIENT FOR SELECT firstnme, lastname, salary FROM employee WHERE workdept = p_dept; OP
9、EN v_cur;END tc第9頁,共20頁。CREATE PROCEDURE base_proc ( ) LANGUAGE SQL SPECIFIC base_proc DYNAMIC RESULT SETS 1 bp: BEGIN - Declare variables DECLARE v_dept CHAR(3) DEFAULT A00; - Procedure logic CALL to_client(v_dept);END bp在執(zhí)行過程base_proc之后,將返回下面的結(jié)果:FIRSTNME LASTNAMESALARYCHRISTINEHAAS52750.00VINCENZO
10、LUCCHESSI46500.00SEANOCONNELL29250.00第10頁,共20頁。如何返回結(jié)果集到調(diào)用者過程 將結(jié)果集返回到調(diào)用者過程需要用到associate locators語句和allocate cursor語句associate locators的語法: associate locator with procedure allocate cursor的語法: allocate cursor for result set 在下面的例子中,過程total_salary調(diào)用過程to_caller1,to_caller過程返回firstname、lastname和salary;調(diào)用
11、者過程total_salary在收到結(jié)果集之后,計算出部門的總的薪水。第11頁,共20頁。CREATE PROCEDURE to_caller1 ( IN p_dept CHAR(3) ) LANGUAGE SQL SPECIFIC to_caller1 DYNAMIC RESULT SETS 1tc1: BEGIN - Procedure logic DECLARE v_cur CURSOR WITH RETURN TO CALLER FOR SELECT firstnme, lastname, salary FROM employee WHERE workdept = p_dept; OP
12、EN v_cur;END tc1第12頁,共20頁。CREATE PROCEDURE total_salary ( IN p_dept CHAR(3) , out p_total DECIMAL(9,2) ) LANGUAGE SQL SPECIFIC total_salary ts: BEGIN DECLARE v_fname VARCHAR(12); DECLARE v_lname VARCHAR(15); DECLARE v_salary DECIMAL(9,2) DEFAULT 0.0; DECLARE v_rs RESULT_SET_LOCATOR VARYING; -(1) - D
13、eclare returncodes DECLARE SQLSTATE CHAR(5) DEFAULT 00000; CALL to_caller1(p_dept); -(2) ASSOCIATE RESULT SET LOCATOR (v_rs) WITH PROCEDURE to_caller1; -(3) ALLOCATE v_rsCur CURSOR FOR RESULT SET v_rs; -(4) SET p_total = 0; WHILE ( SQLSTATE = 00000 ) DO SET p_total = p_total + v_salary; FETCH FROM v
14、_rsCur INTO v_fname, v_lname, v_salary; END WHILE;END ts第13頁,共20頁。接收多個結(jié)果集:過程emp_multi將返回3個結(jié)果集CREATE PROCEDURE emp_multi ( IN p_dept CHAR(3) ) LANGUAGE SQL SPECIFIC emp_multi DYNAMIC RESULT SETS 3em: BEGIN - Procedure logic - Selects firstname DECLARE v_cur1 CURSOR WITH RETURN TO CALLER FOR SELECT fi
15、rstnme FROM employee WHERE workdept = p_dept; - Selects lastname DECLARE v_cur2 CURSOR WITH RETURN TO CALLER FOR SELECT lastname FROM employee WHERE workdept = p_dept; - Selects salary DECLARE v_cur3 CURSOR WITH RETURN TO CALLER FOR SELECT salary FROM employee WHERE workdept = p_dept; OPEN v_cur1; O
16、PEN v_cur2; OPEN v_cur3;END em第14頁,共20頁。CREATE PROCEDURE receive_multi ( in p_dept CHAR(3) , out p_names VARCHAR(100) , out p_total DECIMAL(9,2) ) LANGUAGE SQL SPECIFIC receive_multi rm: BEGIN - Declare variables DECLARE v_fname VARCHAR(12) DEFAULT ; DECLARE v_lname VARCHAR(15) DEFAULT ; DECLARE v_s
17、alary DECIMAL(9,2) DEFAULT 0.0; DECLARE v_rs1, v_rs2, v_rs3 RESULT_SET_LOCATOR VARYING; - Declare returncodes DECLARE SQLSTATE CHAR(5) DEFAULT 00000; - Procedure logic CALL emp_multi(p_dept); ASSOCIATE RESULT SET LOCATOR (v_rs1, v_rs2, v_rs3) WITH PROCEDURE emp_multi; ALLOCATE v_rsCur1 CURSOR FOR RE
18、SULT SET v_rs1; ALLOCATE v_rsCur2 CURSOR FOR RESULT SET v_rs2; ALLOCATE v_rsCur3 CURSOR FOR RESULT SET v_rs3;第15頁,共20頁。 SET p_names = The employees are:; WHILE (SQLSTATE = 00000) DO SET p_names = p_names | v_fname | | v_lname | ; FETCH FROM v_rsCur1 INTO v_fname; FETCH FROM v_rsCur2 INTO v_lname; EN
19、D WHILE; SET p_total = 0; WHILE ( SQLSTATE = 00000 ) DO SET p_total = p_total + v_salary; FETCH FROM v_rsCur3 INTO v_salary; END WHILE;END rm第16頁,共20頁。過程的嵌套總共可以嵌套16層,一個過程可以調(diào)用過程本身,即所謂的遞歸。下面的過程是一個使用遞歸調(diào)用的例子,它用來發(fā)現(xiàn)每個部門完整的報告鏈。CREATE PROCEDURE managers ( IN p_deptno CHAR(3) , out p_report_chain VARCHAR(100
20、) ) LANGUAGE SQL SPECIFIC managers mn: BEGIN - Declare variables DECLARE v_manager_name VARCHAR(15); DECLARE v_admrdept CHAR(3); DECLARE v_report_chain VARCHAR(100); DECLARE v_stmt VARCHAR(100) DEFAULT CALL managers(?,?); -(1) - Procedure logic SELECT admrdept -(2) INTO v_admrdept FROM department WHERE deptno=p_deptno;行(2)發(fā)現(xiàn)該部門的上層管理部門第17頁,共20頁。 SEL
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇教版二年級下冊數(shù)學口算練習題
- 視頻會議系統(tǒng)合同范本
- 網(wǎng)絡(luò)布線及設(shè)備采購合同范本
- 安全協(xié)議書范本及員工責任書
- 滬科版數(shù)學九年級上冊22.3《相似三角形的性質(zhì)》聽評課記錄1
- 二零二五年度校園消毒防疫應(yīng)急預(yù)案合同
- 北師大版歷史七年級上冊第19課《北方的民族匯聚》聽課評課記錄
- 2025年子女撫養(yǎng)權(quán)變更法律援助與協(xié)議書模板
- 2025年度醫(yī)療事故快速調(diào)解專項協(xié)議
- 二零二五年度倉儲物流租賃合同電子版模板即點即用
- T∕CMATB 9002-2021 兒童肉類制品通用要求
- 工序勞務(wù)分包管理課件
- 暖通空調(diào)(陸亞俊編)課件
- 工藝評審報告
- 中國滑雪運動安全規(guī)范
- 畢業(yè)論文-基于51單片機的智能LED照明燈的設(shè)計
- 酒廠食品召回制度
- DG-TJ 08-2343-2020 大型物流建筑消防設(shè)計標準
- 中職數(shù)學基礎(chǔ)模塊上冊第一章《集合》單元檢測試習題及參考答案
- 化學魯科版必修一期末復(fù)習98頁PPT課件
- 《農(nóng)產(chǎn)品質(zhì)量安全檢測》PPT課件
評論
0/150
提交評論