




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
DB2存儲過程基礎(chǔ)培訓(xùn)2008年7月28日DB2存儲過程基礎(chǔ)培訓(xùn)2008年7月28日內(nèi)容提要數(shù)據(jù)類型使用存儲過程的優(yōu)點儲存過程的結(jié)構(gòu)參數(shù)定義變量定義賦值語句條件控制語句循環(huán)語句常用操作符異常處理游標使用動態(tài)游標使用SESSION臨時表使用2內(nèi)容提要數(shù)據(jù)類型2數(shù)據(jù)類型定長型字符串(CHAR)變長型字符串(VARCHAR)整數(shù)類型(SMALLINT、INTEGER、BIGINT)帶小數(shù)點的數(shù)字類型(DECIMAL、REAL、DOUBLE)時間類型(DATE、TIME、TIMESTAMP)對象類型(BLOB、CLOB、DBCLOB)3數(shù)據(jù)類型定長型字符串(CHAR)3使用儲存過程優(yōu)點減少客戶機與服務(wù)器之間的網(wǎng)絡(luò)使用率??蛻魴C應(yīng)用程序?qū)⒖刂茩?quán)傳送到數(shù)據(jù)庫服務(wù)器上的存儲過程。存儲過程在數(shù)據(jù)庫服務(wù)器上執(zhí)行中間處理,而不需要在網(wǎng)絡(luò)中傳送不需要的數(shù)據(jù)。提高安全性。通過使使用靜態(tài)SQL的存儲過程包含數(shù)據(jù)庫特權(quán),數(shù)據(jù)庫管理員(DBA)可以提高安全性。調(diào)用存儲過程的客戶機應(yīng)用程序的用戶不需要數(shù)據(jù)庫特權(quán)。
提高可靠性。在數(shù)據(jù)庫應(yīng)用程序環(huán)境中,許多任務(wù)是重復(fù)的。通過重用一個公共過程,存儲過程就可以高效地解決這些重復(fù)情況。4使用儲存過程優(yōu)點減少客戶機與服務(wù)器之間的網(wǎng)絡(luò)使用率??蛻魴C應(yīng)存儲過程結(jié)構(gòu)存儲過程結(jié)構(gòu)如下:CREATEPROCEDURESP_STAFF(INSALINT)DYNAMICRESULTSETS1LANGUAGESQLREADSSQLDATABEGINDECLAREcur1CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaffWHEREsalary>SAL;OPENcur1;END;5存儲過程結(jié)構(gòu)存儲過程結(jié)構(gòu)如下:5參數(shù)定義1DB2儲存過程的參數(shù)分為兩部分:輸入、輸出參數(shù)和性能相關(guān)參數(shù)。輸入、輸出參數(shù)表示方式:輸入?yún)?shù)用IN開頭輸出參數(shù)用OUT開頭既是輸入又是輸出參數(shù)用INOUT開頭舉例說明:createproceduresp_sample( invar0varchar(10), outvar1varchar(20), inoutvar2varchar(20))6參數(shù)定義1DB2儲存過程的參數(shù)分為兩部分:輸入、輸出參數(shù)和性參數(shù)定義2創(chuàng)建存儲過程語句(CREATEPROCEDURE)可以包含很多參數(shù),雖然從語法角度講它們不是必須的,但是在創(chuàng)建存儲過程時提供它們可以提高執(zhí)行效率。下面是一些常用的參數(shù)容許SQL(allowed-SQL)
容許SQL(allowed-SQL)子句的值指定了存儲過程是否會使用SQL語句,如果使用,其類型如何。它的可能值如下所示:7參數(shù)定義2創(chuàng)建存儲過程語句(CREATEPROCEDURE參數(shù)定義3NOSQL:表示存儲過程不能夠執(zhí)行任何SQL語句。CONTAINSSQL:表示存儲過程可以執(zhí)行SQL語句,但不會讀取SQL數(shù)據(jù),也不會修改SQL數(shù)據(jù)。READSSQLDATA:表示在存儲過程中包含不會修改SQL數(shù)據(jù)的SQL語句。也就是說該儲存過程只從數(shù)據(jù)庫中讀取數(shù)據(jù)。MODIFIESSQLDATA:表示存儲過程可以執(zhí)行任何SQL語句。即可以對數(shù)據(jù)庫中的數(shù)據(jù)進行增加、刪除和修改。如果沒有明確聲明allowed-SQL,其默認值是MODIFIESSQLDATA。不同類型的存儲過程執(zhí)行的效率是不同的,其中NOSQL效率最好,MODIFIESSQLDATA最差。如果存儲過程只是讀取數(shù)據(jù),但是因為沒有聲明allowed-SQL使其被當(dāng)作對數(shù)據(jù)進行修改的存儲過程來執(zhí)行,這顯然會降低程序的執(zhí)行效率。因此創(chuàng)建存儲過程時,應(yīng)當(dāng)明確聲明其allowed-SQL。8參數(shù)定義3NOSQL:表示存儲過程不能夠執(zhí)行任何SQL參數(shù)定義4返回結(jié)果集個數(shù)(DYNAMICRESULTSETSn)
存儲過程能夠返回0個或者多個結(jié)果集。為了從存儲過程中返回結(jié)果集,需要執(zhí)行如下步驟:
在CREATEPROCEDURE語句的DYNAMICRESULTSETS子句中聲明存儲過程將要返回的結(jié)果集的數(shù)量(number-of-result-sets)。如果這里聲明的返回結(jié)果集的數(shù)量小于存儲過程中實際返回的結(jié)果集數(shù)量,在執(zhí)行該存儲過程的時候,DB2會返回一個警告。如下存儲過程就會返回警告:9參數(shù)定義4返回結(jié)果集個數(shù)(DYNAMICRESULTSE參數(shù)定義5CREATEPROCEDURERESULT_SET()DYNAMICRESULTSETS1LANGUAGESQLREADSSQLDATABEGINDECLAREcur1CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaffWHEREsalary>20000;DECLAREcur2CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaffWHEREsalary<20000;OPENcur1;OPENcur2;END;10參數(shù)定義5CREATEPROCEDURERESULT_S變量定義存儲過程中可以使用關(guān)鍵字DECLARE定義變量,然后在后續(xù)程序過程中使用變量來處理邏輯。定義變量時可以指定一個初始值。舉例說明:DECLAREtemp1SMALLINTDEFAULT0;DECLAREtemp2INTEGERDEFAULT10;DECLAREtemp3DECIMAL(10,2)DEFAULT100.10;DECLAREtemp4REALDEFAULT10.1;DECLAREtemp5DOUBLEDEFAULT10000.1001;DECLAREtemp6BIGINTDEFAULT10000;DECLAREtemp7CHAR(10)DEFAULT'yes';DECLAREtemp8VARCHAR(10)DEFAULT'hello';DECLAREtemp9DATEDEFAULT'1998-12-25';DECLAREtemp10TIMEDEFAULT'1:50PM';DECLAREtemp11TIMESTAMPDEFAULT'2001-01-05-12.00.00';DECLAREtemp12CLOB(2G);DECLAREtemp13BLOB(2G);11變量定義存儲過程中可以使用關(guān)鍵字DECLARE定義變量,然后賦值語句存儲過程使用關(guān)鍵字SET給變量賦值。舉例說明:SETtotal=100;VALUES(100,200,200+1)INTOvar1,var2,var3;/*并行賦值,效率高*/SETtotal=NULL;SETtotal=(selectsum(c1)fromT1);SETsch=CURRENTSCHEMA;12賦值語句存儲過程使用關(guān)鍵字SET給變量賦值。12條件控制語句2CASE…WHEN舉例說明:CASEWHENv_workdept='A00' THENUPDATEdepartment SETdeptname='DATAACCESS1';WHENv_workdept='B01' THENUPDATEdepartment SETdeptname='DATAACCESS2';ELSEUPDATEdepartment SETdeptname='DATAACCESS3';ENDCASE
13條件控制語句2CASE…WHEN13循環(huán)語句1循環(huán)語句包括以下幾種:WHILE舉例說明:WHILEv_counter<(v_numRecords/2+1)DOSETv_salary1=v_salary2; SETv_counter=v_counter+1;ENDWHILE;14循環(huán)語句1循環(huán)語句包括以下幾種:14循環(huán)語句2LOOP舉例說明:LOOPFETCHc1INTOv_firstnme,v_midinit,v_lastname;--Usealocalvariablefortheiteratorvariable--becauseSQLproceduresonlyallowyoutoassign--valuestoanOUTparameterSETv_counter=v_counter+1;IFv_midinit=''THENLEAVEfetch_loop;ENDIF;ENDLOOPfetch_loop;15循環(huán)語句2LOOP15循環(huán)語句3FOR舉例說明:CREATEPROCEDUREConcat_names()LANGUAGESQLBEGIN--Note:implicitcursormanipulationDECLAREfullnameCHAR(140);FORv1ASSELECTfirstnme,midinit,lastnameFROMemployeeDOSETfullname=v1.lastname||','||v1.firstnme||''||v1.midinit;INSERTINTOtnameVALUES(fullname);ENDFOR;END16循環(huán)語句3FOR16常用操作符常用操作符有以下幾種:關(guān)系運算符關(guān)系運算符有六種:小于、小于等于、大于、大于等于、等于、不等于邏輯運算符邏輯運算符有三種:AND、OR、NOT17常用操作符常用操作符有以下幾種:17異常處理1任何SQL語句執(zhí)行若發(fā)生SQLSTATE<>’00000’的情況都可能喚起condition,可以是通用的conditions:SQLWARNING,SQLEXCEPTION,NOTFOUND,如:
DECLAREnot_foundCONDITIONFORNOTFOUND;也可以是指定SQLSTATE的conditions,如:
DECLAREtruncCONDITIONFORSQLSTATE'01004';注意:為避免未預(yù)見的出錯情況出現(xiàn)后被忽略,應(yīng)盡量避免定義SQLEXCEPTIONCONDITION,而應(yīng)針對具體的SQLSTATE定義CONDITION。18異常處理1任何SQL語句執(zhí)行若發(fā)生SQLSTATE<>’00異常處理2CONDITIONHANDLE的定義:BEGIN
DECLARE<type>HANDLERFOR<conditions>喚醒conditions
<handler-action>CONTINUE點
statement_1;
statement_2;EXIT或UNDO點
statement_3;
END<type>定義出錯處理動作:CONTINUE,EXIT或UNDO。<conditions>為已經(jīng)定義的condition名或是直接的通用conditions,可以是多個<handler-action>是一條或多條語句,可以包含控制語句19異常處理2CONDITIONHANDLE的定義:19異常處理3例子:DECLARECONTINUEHANDLERFORnot_found,SQLEXCEPTIONSETat_end=1;DECLARECONTINUEHANDLERFORtruncBEGINSETtruncated=1;SETmsg=’message’;END;注意:若SQLPROCEDURE語句執(zhí)行后SQLSTATE=’02000’或SQLSTATE=’01xxx’,引起SQLWARNING或NOTFOUND條件,且定義了相應(yīng)條件的handler,則DB2將控制交給相應(yīng)handler;若未定義handler,則DB2設(shè)SQLSTATE及SQLCODE值并繼續(xù)運行。20異常處理3例子:20異常處理4若SQLPROCEDURE語句執(zhí)行后出錯,引起SQLEXCEPTION條件,且定義了相應(yīng)條件的handler,則DB2將控制交給相應(yīng)handler,若handler運行成功,則SQLCODE及SQLSTATE重置為0及’00000’;若未定義handler,則DB2中止PROCEDURE并返回CLIENT。需要注意的是,任何語句的成功執(zhí)行都會將SQLCODE、SQLSTATE重置為0,’00000’。若需要截獲出錯代碼,唯一的方法是在handler的第一條語句將其中的一個值保存在變量中,如:DECLARECONTINUEHANDLERforSQLEXCEPTIONSETSaved_SQLCODE=SQLCODE;若PROCEDURE中需要向客戶端返回用戶錯誤信息,可使用SIGNAL:
SIGNALSQLSTATE‘20000’SETMESSAGE_TEXT=’找不到用戶記錄’MESSAGE_TEXT也可以是一個字符串變量,此功能可以用來調(diào)試存儲過程。21異常處理4若SQLPROCEDURE語句執(zhí)行后出錯,引起S游標使用1游標有兩種類型:靜態(tài)的和動態(tài)的。使用游標前要先定義,然后可以使用循環(huán)語句操作游標。舉例說明:CREATEPROCEDUREleave_loop(OUTcounterINT)LANGUAGESQLBEGINDECLARESQLSTATECHAR(5);DECLAREv_firstnmeVARCHAR(12);DECLAREv_midinitCHAR(1);DECLAREv_lastnameVARCHAR(15);DECLAREv_counterSMALLINTDEFAULT0;DECLAREat_endSMALLINTDEFAULT0;DECLAREnot_foundCONDITIONforSQLSTATE'02000';22游標使用1游標有兩種類型:靜態(tài)的和動態(tài)的。使用游標前要先定義游標使用2DECLAREc1CURSORFORSELECTfirstnme,midinit,lastnameFROMemployee;DECLARECONTINUEHANDLERfornot_foundSETat_end=1;--initializeOUTparameterSETcounter=0;
OPENc1;fetch_loop:LOOPFETCHc1INTOv_firstnme,v_midinit,v_lastname;IFat_end<>0THENLEAVEfetch_loop;ENDIF;23游標使用2DECLAREc1CURSORFOR23游標使用3--Usealocalvariablefortheiteratorvariable--becauseSQLproceduresonlyallowyoutoassign--valuestoanOUTparameterSETv_counter=v_counter+1;ENDLOOPfetch_loop;CLOSEc1;--Nowassignthevalueofthelocal--variabletotheOUTparameterSETcounter=v_counter;END@24游標使用3--Usealocalvariablef動態(tài)游標使用動態(tài)游標使用起來比較方便靈活,在存儲過程中會經(jīng)常用到,也推薦使用動態(tài)游標處理邏輯。舉例說明:CREATEPROCEDUREDynamic_Cursor(INSALINT)
DYNAMICRESULTSETS1
LANGUAGESQL
READSSQLDATA
BEGIN
DECLAREstmtvarchar(255);
DECLAREstSTATEMENT;
DECLAREcur1CURSORWITHRETURNFORst;
SETstmt='SELECTname,dept,job,salaryFROMstaffWHEREsalary>?';
PREPAREstFROMstmt;
OPENcur1USINGSAL;
END;25動態(tài)游標使用動態(tài)游標使用起來比較方便靈活,在存儲過程中會經(jīng)常SESSION臨時表使用1臨時表只能建立在用戶臨時表空間上,而不能建立在系統(tǒng)臨時表空間上。臨時表是在一個SESSION內(nèi)有效的。如果程序有多線程,最好不要使用臨時表,因為比較難控制。建立臨時表最好加上withreplace選項,這樣可以不顯示地drop臨時表。舉例說明:CREATEPROCEDUREDB2ADMIN.TEP_TABLE_TEST(
)
DYNAMICRESULTSETS1
LANGUAGESQL
MODIFIESSQLDATA
BEGIN
--定義錯誤代碼DECLARESQLCODEINTEGERDEFAULT0;
DECLARESQLSTATECHAR(5)DEFAULT'00000';
DECLAREnot_foundCONDITIONFORSQLSTATE'02000';
DECLAREat_endINTEGERDEFAULT0;26SESSION臨時表使用1臨時表只能建立在用戶臨時表空間上,SESSION臨時表使用2--定義變量
DECLAREGET_NAMEVARCHAR(9);
DECLAREGET_DEPTSMALLINT;
DECLAREGET_JOBCHARACTER(5);
DECLAREGET_SALARYDECIMAL(7,2);--定義全局臨時表
DECLAREGLOBALTEMPORARYTABLESESSION.TEMP
LIKESTAFF1
WITHREPLACE
NOTLOGGED
INQCTEMPTS;
P2:BEGIN--定義游標DECLAREcur1CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaff
WHEREsalary>20000;27SESSION臨時表使用2--定義變量27SESSION臨時表使用3--定義異常處理
DECLARECONTINUEHANDLERFORnot_found
SETat_end=1;OPENcur1;
FETCH_LOOP1:
LOOP
FETCHCUR1INTOGET_NAME,GET_DEPT,GET_JOB,GET_SALARY;
IFat_end=1THEN
SETat_end=0;
LEAVEFETCH_LOOP1;
ENDIF;
INSERTINTOSESSION.TEMPVALUES(GET_NAME,GET_DEPT,GET_JOB,GET_SALARY);
ENDLOOPFETCH_LOOP1;
INSERTINTOSTAFF1SELECT*FROMSESSION.TEMP;
ENDP2;END;28SESSION臨時表使用3--定義異常處理
DECTHANKYOUTHANKYOU29演講完畢,謝謝觀看!演講完畢,謝謝觀看!30DB2存儲過程基礎(chǔ)培訓(xùn)2008年7月28日DB2存儲過程基礎(chǔ)培訓(xùn)2008年7月28日內(nèi)容提要數(shù)據(jù)類型使用存儲過程的優(yōu)點儲存過程的結(jié)構(gòu)參數(shù)定義變量定義賦值語句條件控制語句循環(huán)語句常用操作符異常處理游標使用動態(tài)游標使用SESSION臨時表使用32內(nèi)容提要數(shù)據(jù)類型2數(shù)據(jù)類型定長型字符串(CHAR)變長型字符串(VARCHAR)整數(shù)類型(SMALLINT、INTEGER、BIGINT)帶小數(shù)點的數(shù)字類型(DECIMAL、REAL、DOUBLE)時間類型(DATE、TIME、TIMESTAMP)對象類型(BLOB、CLOB、DBCLOB)33數(shù)據(jù)類型定長型字符串(CHAR)3使用儲存過程優(yōu)點減少客戶機與服務(wù)器之間的網(wǎng)絡(luò)使用率。客戶機應(yīng)用程序?qū)⒖刂茩?quán)傳送到數(shù)據(jù)庫服務(wù)器上的存儲過程。存儲過程在數(shù)據(jù)庫服務(wù)器上執(zhí)行中間處理,而不需要在網(wǎng)絡(luò)中傳送不需要的數(shù)據(jù)。提高安全性。通過使使用靜態(tài)SQL的存儲過程包含數(shù)據(jù)庫特權(quán),數(shù)據(jù)庫管理員(DBA)可以提高安全性。調(diào)用存儲過程的客戶機應(yīng)用程序的用戶不需要數(shù)據(jù)庫特權(quán)。
提高可靠性。在數(shù)據(jù)庫應(yīng)用程序環(huán)境中,許多任務(wù)是重復(fù)的。通過重用一個公共過程,存儲過程就可以高效地解決這些重復(fù)情況。34使用儲存過程優(yōu)點減少客戶機與服務(wù)器之間的網(wǎng)絡(luò)使用率??蛻魴C應(yīng)存儲過程結(jié)構(gòu)存儲過程結(jié)構(gòu)如下:CREATEPROCEDURESP_STAFF(INSALINT)DYNAMICRESULTSETS1LANGUAGESQLREADSSQLDATABEGINDECLAREcur1CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaffWHEREsalary>SAL;OPENcur1;END;35存儲過程結(jié)構(gòu)存儲過程結(jié)構(gòu)如下:5參數(shù)定義1DB2儲存過程的參數(shù)分為兩部分:輸入、輸出參數(shù)和性能相關(guān)參數(shù)。輸入、輸出參數(shù)表示方式:輸入?yún)?shù)用IN開頭輸出參數(shù)用OUT開頭既是輸入又是輸出參數(shù)用INOUT開頭舉例說明:createproceduresp_sample( invar0varchar(10), outvar1varchar(20), inoutvar2varchar(20))36參數(shù)定義1DB2儲存過程的參數(shù)分為兩部分:輸入、輸出參數(shù)和性參數(shù)定義2創(chuàng)建存儲過程語句(CREATEPROCEDURE)可以包含很多參數(shù),雖然從語法角度講它們不是必須的,但是在創(chuàng)建存儲過程時提供它們可以提高執(zhí)行效率。下面是一些常用的參數(shù)容許SQL(allowed-SQL)
容許SQL(allowed-SQL)子句的值指定了存儲過程是否會使用SQL語句,如果使用,其類型如何。它的可能值如下所示:37參數(shù)定義2創(chuàng)建存儲過程語句(CREATEPROCEDURE參數(shù)定義3NOSQL:表示存儲過程不能夠執(zhí)行任何SQL語句。CONTAINSSQL:表示存儲過程可以執(zhí)行SQL語句,但不會讀取SQL數(shù)據(jù),也不會修改SQL數(shù)據(jù)。READSSQLDATA:表示在存儲過程中包含不會修改SQL數(shù)據(jù)的SQL語句。也就是說該儲存過程只從數(shù)據(jù)庫中讀取數(shù)據(jù)。MODIFIESSQLDATA:表示存儲過程可以執(zhí)行任何SQL語句。即可以對數(shù)據(jù)庫中的數(shù)據(jù)進行增加、刪除和修改。如果沒有明確聲明allowed-SQL,其默認值是MODIFIESSQLDATA。不同類型的存儲過程執(zhí)行的效率是不同的,其中NOSQL效率最好,MODIFIESSQLDATA最差。如果存儲過程只是讀取數(shù)據(jù),但是因為沒有聲明allowed-SQL使其被當(dāng)作對數(shù)據(jù)進行修改的存儲過程來執(zhí)行,這顯然會降低程序的執(zhí)行效率。因此創(chuàng)建存儲過程時,應(yīng)當(dāng)明確聲明其allowed-SQL。38參數(shù)定義3NOSQL:表示存儲過程不能夠執(zhí)行任何SQL參數(shù)定義4返回結(jié)果集個數(shù)(DYNAMICRESULTSETSn)
存儲過程能夠返回0個或者多個結(jié)果集。為了從存儲過程中返回結(jié)果集,需要執(zhí)行如下步驟:
在CREATEPROCEDURE語句的DYNAMICRESULTSETS子句中聲明存儲過程將要返回的結(jié)果集的數(shù)量(number-of-result-sets)。如果這里聲明的返回結(jié)果集的數(shù)量小于存儲過程中實際返回的結(jié)果集數(shù)量,在執(zhí)行該存儲過程的時候,DB2會返回一個警告。如下存儲過程就會返回警告:39參數(shù)定義4返回結(jié)果集個數(shù)(DYNAMICRESULTSE參數(shù)定義5CREATEPROCEDURERESULT_SET()DYNAMICRESULTSETS1LANGUAGESQLREADSSQLDATABEGINDECLAREcur1CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaffWHEREsalary>20000;DECLAREcur2CURSORWITHRETURNFORSELECTname,dept,job,salaryFROMstaffWHEREsalary<20000;OPENcur1;OPENcur2;END;40參數(shù)定義5CREATEPROCEDURERESULT_S變量定義存儲過程中可以使用關(guān)鍵字DECLARE定義變量,然后在后續(xù)程序過程中使用變量來處理邏輯。定義變量時可以指定一個初始值。舉例說明:DECLAREtemp1SMALLINTDEFAULT0;DECLAREtemp2INTEGERDEFAULT10;DECLAREtemp3DECIMAL(10,2)DEFAULT100.10;DECLAREtemp4REALDEFAULT10.1;DECLAREtemp5DOUBLEDEFAULT10000.1001;DECLAREtemp6BIGINTDEFAULT10000;DECLAREtemp7CHAR(10)DEFAULT'yes';DECLAREtemp8VARCHAR(10)DEFAULT'hello';DECLAREtemp9DATEDEFAULT'1998-12-25';DECLAREtemp10TIMEDEFAULT'1:50PM';DECLAREtemp11TIMESTAMPDEFAULT'2001-01-05-12.00.00';DECLAREtemp12CLOB(2G);DECLAREtemp13BLOB(2G);41變量定義存儲過程中可以使用關(guān)鍵字DECLARE定義變量,然后賦值語句存儲過程使用關(guān)鍵字SET給變量賦值。舉例說明:SETtotal=100;VALUES(100,200,200+1)INTOvar1,var2,var3;/*并行賦值,效率高*/SETtotal=NULL;SETtotal=(selectsum(c1)fromT1);SETsch=CURRENTSCHEMA;42賦值語句存儲過程使用關(guān)鍵字SET給變量賦值。12條件控制語句2CASE…WHEN舉例說明:CASEWHENv_workdept='A00' THENUPDATEdepartment SETdeptname='DATAACCESS1';WHENv_workdept='B01' THENUPDATEdepartment SETdeptname='DATAACCESS2';ELSEUPDATEdepartment SETdeptname='DATAACCESS3';ENDCASE
43條件控制語句2CASE…WHEN13循環(huán)語句1循環(huán)語句包括以下幾種:WHILE舉例說明:WHILEv_counter<(v_numRecords/2+1)DOSETv_salary1=v_salary2; SETv_counter=v_counter+1;ENDWHILE;44循環(huán)語句1循環(huán)語句包括以下幾種:14循環(huán)語句2LOOP舉例說明:LOOPFETCHc1INTOv_firstnme,v_midinit,v_lastname;--Usealocalvariablefortheiteratorvariable--becauseSQLproceduresonlyallowyoutoassign--valuestoanOUTparameterSETv_counter=v_counter+1;IFv_midinit=''THENLEAVEfetch_loop;ENDIF;ENDLOOPfetch_loop;45循環(huán)語句2LOOP15循環(huán)語句3FOR舉例說明:CREATEPROCEDUREConcat_names()LANGUAGESQLBEGIN--Note:implicitcursormanipulationDECLAREfullnameCHAR(140);FORv1ASSELECTfirstnme,midinit,lastnameFROMemployeeDOSETfullname=v1.lastname||','||v1.firstnme||''||v1.midinit;INSERTINTOtnameVALUES(fullname);ENDFOR;END46循環(huán)語句3FOR16常用操作符常用操作符有以下幾種:關(guān)系運算符關(guān)系運算符有六種:小于、小于等于、大于、大于等于、等于、不等于邏輯運算符邏輯運算符有三種:AND、OR、NOT47常用操作符常用操作符有以下幾種:17異常處理1任何SQL語句執(zhí)行若發(fā)生SQLSTATE<>’00000’的情況都可能喚起condition,可以是通用的conditions:SQLWARNING,SQLEXCEPTION,NOTFOUND,如:
DECLAREnot_foundCONDITIONFORNOTFOUND;也可以是指定SQLSTATE的conditions,如:
DECLAREtruncCONDITIONFORSQLSTATE'01004';注意:為避免未預(yù)見的出錯情況出現(xiàn)后被忽略,應(yīng)盡量避免定義SQLEXCEPTIONCONDITION,而應(yīng)針對具體的SQLSTATE定義CONDITION。48異常處理1任何SQL語句執(zhí)行若發(fā)生SQLSTATE<>’00異常處理2CONDITIONHANDLE的定義:BEGIN
DECLARE<type>HANDLERFOR<conditions>喚醒conditions
<handler-action>CONTINUE點
statement_1;
statement_2;EXIT或UNDO點
statement_3;
END<type>定義出錯處理動作:CONTINUE,EXIT或UNDO。<conditions>為已經(jīng)定義的condition名或是直接的通用conditions,可以是多個<handler-action>是一條或多條語句,可以包含控制語句49異常處理2CONDITIONHANDLE的定義:19異常處理3例子:DECLARECONTINUEHANDLERFORnot_found,SQLEXCEPTIONSETat_end=1;DECLARECONTINUEHANDLERFORtruncBEGINSETtruncated=1;SETmsg=’message’;END;注意:若SQLPROCEDURE語句執(zhí)行后SQLSTATE=’02000’或SQLSTATE=’01xxx’,引起SQLWARNING或NOTFOUND條件,且定義了相應(yīng)條件的handler,則DB2將控制交給相應(yīng)handler;若未定義handler,則DB2設(shè)SQLSTATE及SQLCODE值并繼續(xù)運行。50異常處理3例子:20異常處理4若SQLPROCEDURE語句執(zhí)行后出錯,引起SQLEXCEPTION條件,且定義了相應(yīng)條件的handler,則DB2將控制交給相應(yīng)handler,若handler運行成功,則SQLCODE及SQLSTATE重置為0及’00000’;若未定義handler,則DB2中止PROCEDURE并返回CLIENT。需要注意的是,任何語句的成功執(zhí)行都會將SQLCODE、SQLSTATE重置為0,’00000’。若需要截獲出錯代碼,唯一的方法是在handler的第一條語句將其中的一個值保存在變量中,如:DECLARECONTINUEHANDLERforSQLEXCEPTIONSETSaved_SQLCODE=SQLCODE;若PROCEDURE中需要向客戶端返回用戶錯誤信息,可使用SIGNAL:
SIGNALSQLSTATE‘20000’SETMESSAGE_TEXT=’找不到用戶記錄’MESSAGE_TEXT也可以是一個字符串變量,此功能可以用來調(diào)試存儲過程。51異常處理4若SQLPROCEDURE語句執(zhí)行后出錯,引起S游標使用1游標有兩種類型:靜態(tài)的和動態(tài)的。使用游標前要先定義,然后可以使用循環(huán)語句操作游標。舉例說明:CREATEPROCEDUREleave_loop(OUTcounterINT)LANGUAGESQLBEGINDECLARESQLSTATECHAR(5);DECLAREv_firstnmeVARCHAR(12);DECLAREv_midinitCHAR(1);DECLAREv_lastnameVARCHAR(15);DECLAREv_counterSMALLINTDEFAULT0;DECLAREat_endSMALLINTDEFAULT0;DECLAREnot_foundCONDITIONforSQLSTATE'02000';52游標使用1游標有兩種類型:靜態(tài)的和動態(tài)的。使用游標前要先定義游標使用2DECLAREc1CURSORFORSELECTfirstnme,midinit,lastnameFROMemployee;DECLARECONTINUEHANDLERfornot_foundSETat_end=1;--initializeOUTparameterSETcounter=0;
OPENc1;fetch_loop:LOOPFETCHc1INTOv_firstnme,v_midinit,v_lastname;IFat_end<>0THENLEAVEfetch_loop;ENDIF;53游標使用2DECLAREc1CURSORFOR23游標使用3--Usealocalvariablefortheiteratorvariable--becauseSQLproceduresonlyallowyoutoassign--valuestoanOUTparameterSETv_counter=v_counter+1;ENDLOOPfetch_loop;CLOSEc1;--Nowassignthevalueofthelocal--variabletotheOUTparameterSETcounter=v_counter;END@54游標使用3--Usealocalvariablef動態(tài)游標使用動態(tài)游標使用起來比較方便靈活,在存儲過程中會經(jīng)常用到,也推薦使用動態(tài)游標處理邏輯。舉例說明:CREATEPROCEDUREDynamic_Cursor(INSALINT)
DYNAMICRESULTSETS1
LANGUA
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 泥水班組承包施工合同
- 工程施工承包合同范本
- 代購代銷合同協(xié)議書
- 維語心理測試題庫及答案
- 2025年電力維修工程分包合同管理規(guī)程
- 2025年影視版權(quán)授權(quán)合同要素
- 水力學(xué)計算試題和答案
- 文字綜合筆試題目及答案
- 信息技術(shù)考試flash試題及答案
- 一級注冊建筑師重點題庫和答案分析2025年
- 第二章 臨床血液學(xué)檢驗
- 2025年大學(xué)生英語六級必考詞匯表全部匯編(帶音標)
- GB/T 28572-2025大中型水輪機進水閥門規(guī)格及技術(shù)參數(shù)
- 《鄉(xiāng)村旅游規(guī)劃與實踐》課件-項目七 鄉(xiāng)村旅游商品開發(fā)與設(shè)計
- 工程項目管理工作流程圖
- 2025年山東光明電力服務(wù)公司招聘筆試參考題庫含答案解析
- 2024指紋鎖智能家居系統(tǒng)定制開發(fā)合同范本3篇
- 學(xué)校體育教學(xué)與心理健康教育融合策略
- 2025年中原出版?zhèn)髅郊瘓F招聘筆試參考題庫含答案解析
- 公共就業(yè)服務(wù)職場適應(yīng)與職業(yè)素養(yǎng)培養(yǎng)考核試卷
- UL1439標準中文版-2018設(shè)備邊緣鋒利度測試UL中文版標準
評論
0/150
提交評論