版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.1掌握數(shù)據(jù)類型和操作符0102記錄類型%TYPE和%ROWTYPE03數(shù)組類型04集合類型05操作符6.1.1%TYPE和%ROWTYPE
在許多時候,DMSQL程序變量被用來處理存儲在數(shù)據(jù)庫表中的數(shù)據(jù)。這種情況下,變量應(yīng)該擁有與表列相同的類型。如果用戶應(yīng)用中有很多的變量以及DMSQL程序代碼,這種處理可能是十分耗時和容易出錯的。為了解決上述問題,DMSQL程序提供了%TYPE數(shù)據(jù)類型和%ROWTYPE數(shù)據(jù)類型。%TYPE可以將變量同表列的類型進行綁定。與%TYPE類似,%ROWTYPE將返回一個基于表定義的運算類型,它將一個記錄聲明為具有相同類型的數(shù)據(jù)庫行。在DMSQL程序設(shè)計中使用%TYPE和%ROWTYPE是一種非常好的編程風(fēng)格,它使得DMSQL程序更加靈活,更適應(yīng)于對數(shù)據(jù)庫的處理。6.1.1%TYPE和%ROWTYPE
定義%TYPE變量的語法片段:DECLAREV_NAMET.NAME%TYPE;BEGIN......END;/6.1.1%TYPE和%ROWTYPE
【案例6-1】設(shè)置一個與職工表姓名字段類型一致的變量V_NAME,將職工號3001職工的姓名記錄在V_NAME中并輸出。在輸出的V_NAME變量內(nèi)容前增加提示語“所查找的職工姓名為:”。DECLARE
V_NAMESCH_FACTORY.STAFF.姓名%TYPE;BEGIN
SELECT姓名INTOV_NAMEFROMSCH_FACTORY.STAFFWHERE職工號=3001;
PRINT('所查找的職工姓名為:'||V_NAME);END;/6.1.1%TYPE和%ROWTYPE
定義%ROWTYPE變量的語法片段:DECLAREV_TRECT%ROWTYPE;BEGIN......END;/6.1.1%TYPE和%ROWTYPE
【案例6-2】設(shè)置一個與職工表數(shù)據(jù)行字段類型一致的變量V_NAME,將職工號3001職工的信息記錄在V_NAME中并輸出其“姓名”和“年齡”。在輸出的V_NAME變量內(nèi)容前分別增加提示語“所查找的職工姓名為:”和“所查找的職工年齡為:”。DECLAREV_NAMESCH_FACTORY.STAFF%ROWTYPE;BEGINSELECT*INTOV_NAMEFROMSCH_FACTORY.STAFFWHERE職工號=3001;PRINT('所查找的職工姓名為:'||V_NAME.姓名);PRINT('所查找的職工年齡為:'||V_NAME.年齡);END;/6.1.2記錄類型記錄類型是由單行多列的標(biāo)量類型構(gòu)成復(fù)合類型,類似于C語言中的結(jié)構(gòu)。記錄類型提供了處理獨立但又作為一個整體單元的相關(guān)變量的一種機制。定義記錄類型的語法如下所示:TYPE<記錄類型名>ISRECORD(<字段名><數(shù)據(jù)類型>[<default子句>]{,<字段名><數(shù)據(jù)類型>[<default子句>]});6.1.2記錄類型default子句的相關(guān)說明如下所示:<default子句>::=<default子句1>|<default子句2><default子句1>::=DEFAULT<缺省值><default子句2>::=:=<缺省值>通過將需要操作的表結(jié)構(gòu)定義成一個記錄,可以方便地對表中的行數(shù)據(jù)進行操作。在DMSQL程序中使用記錄,需要先定義一個RECORD類型,再用該類型聲明變量,可以單獨對記錄中的字段賦值,使用點標(biāo)記引用一個記錄中的字段(記錄名.字段名)6.1.2記錄類型【案例6-3】定義一個記錄類型r_staff,包含name和age兩個字段,字段類型分別對應(yīng)SCH_FACTORY模式中的STAFF表中的“姓名”和“年齡”兩個字段。聲明一個該記錄類型的變量v_staff,使用點標(biāo)記為v_staff的兩個字段賦值,然后使用v_staff更新STAFF表的姓名為“張童”的年齡為28。6.1.2記錄類型DECLARETYPEr_staffISRECORD(nameSCH_FACTORY.STAFF.姓名%TYPE,ageSCH_FACTORY.STAFF.年齡%TYPE);v_staffr_staff;BEGIN v_:='張童'; v_staff.age:=28; UPDATESCH_FACTORY.STAFFSET年齡=v_staff.ageWHERE姓名=v_; COMMIT;END;/6.1.3數(shù)組類型1、靜態(tài)數(shù)組類型2、動態(tài)數(shù)組類型6.1.3數(shù)組類型1、靜態(tài)數(shù)組類型靜態(tài)數(shù)組是在聲明時就已經(jīng)確定了數(shù)組大小的數(shù)組,其長度是預(yù)先定義好的,在整個程序中,一旦給定大小后就無法改變。定義靜態(tài)數(shù)組類型的語法圖如圖所示:6.1.3數(shù)組類型1、靜態(tài)數(shù)組類型定義了靜態(tài)數(shù)組類型后需要用這個類型申明一個數(shù)組變量然后進行操作。理論上DM支持靜態(tài)數(shù)組的每一個維度的最大長度為65534,但是靜態(tài)數(shù)組最大長度同時受系統(tǒng)內(nèi)部堆??臻g大小的限制,如果超出堆棧的空間限制,系統(tǒng)會報錯。6.1.3數(shù)組類型1、靜態(tài)數(shù)組類型DECLARE
TYPEArrISARRAYVARCHAR[3]; --TYPE定義一維數(shù)組類型
AArr;
--聲明一維數(shù)組
TYPEArr1ISARRAYVARCHAR[2,4]; --TYPE定義二維數(shù)組類型
BArr1; --聲明二維數(shù)組BEGIN
......END;/6.1.3數(shù)組類型2、動態(tài)數(shù)組類型與靜態(tài)數(shù)組不同,動態(tài)數(shù)組可以隨程序需要而重新指定大小,其內(nèi)存空間是從堆(HEAP)上分配(即動態(tài)分配)的,通過執(zhí)行代碼而為其分配存儲空間,并由DM自動釋放內(nèi)存。動態(tài)數(shù)組與靜態(tài)數(shù)組的定義方法類似,區(qū)別只在于動態(tài)數(shù)組沒有指定下標(biāo),需要動態(tài)分配空間。定義動態(tài)數(shù)組類型的語法圖如圖所示:6.1.3數(shù)組類型2、動態(tài)數(shù)組類型定義了動態(tài)數(shù)組類型后需要用這個類型申明一個數(shù)組變量,之后在DMSQL程序的執(zhí)行部分需要為這個數(shù)組變量動態(tài)分配空間。動態(tài)分配空間語法如下所示:數(shù)組變量名:=NEW數(shù)據(jù)類型[常量表達式,…];數(shù)組變量名:=NEW數(shù)據(jù)類型[常量表達式][];--對多維數(shù)組的某一維度進行空間分配6.1.3數(shù)組類型2、動態(tài)數(shù)組類型【案例6-4】使用動態(tài)數(shù)組打印4的1倍、2倍、3倍、4倍的數(shù)字。DECLARETYPEArrISARRAYVARCHAR[];aArr;BEGINa:=NEWVARCHAR[4];--動態(tài)分配空間FORIIN1..4LOOPa[I]:=I*4;PRINTa[I];ENDLOOP;END;/6.1.4集合類型1、VARRAY類型2、索引表類型3、嵌套表類型6.1.4集合類型1、VARRAY類型VARRAY是一種具有可伸縮性的數(shù)組,數(shù)組中的每個元素具有相同的數(shù)據(jù)類型。VARRAY在定義時由用戶指定一個最大容量,其元素索引是從1開始的有序數(shù)字。定義VARRAY的語法格式如下所示:TYPE<數(shù)組名>ISVARRAY(<常量表達式>)OF<數(shù)據(jù)類型>;6.1.4集合類型1、VARRAY類型在定義了一個VARRAY數(shù)組類型后,再聲明一個該數(shù)組類型的變量,就可以對這個數(shù)組變量進行操作了。如下面的代碼片段所示:TYPEmy_array_typeISVARRAY(10)OFINTEGER;vMY_ARRAY_TYPE;6.1.4集合類型2、索引表類型索引表提供了一種快速、方便地管理一組相關(guān)數(shù)據(jù)的方法。索引表是一組數(shù)據(jù)的集合,它將數(shù)據(jù)按照一定規(guī)則組織起來,形成一個可操作的整體,是對大量數(shù)據(jù)進行有效組織和管理的手段之一,通過函數(shù)可以對大量性質(zhì)相同的數(shù)據(jù)進行存儲、排序、插入及刪除等操作,從而可以有效地提高程序開發(fā)效率及改善程序的編寫方式。索引表不需要用戶指定大小,其大小根據(jù)用戶的操作自動增長。定義索引表的語法格式如下所示:TYPE<索引表名>ISTABLEOF<數(shù)據(jù)類型>INDEXBY<索引數(shù)據(jù)類型>;6.1.4集合類型2、索引表類型【案例6-5】定義數(shù)據(jù)類型為VARCHAR,索引類型為INT的索引表。然后使用該索引表記錄1號元素為’TEST1’,2號元素為’TEST2’,3號元素為1號元素和2號元素的組合,最后打印3號元素。6.1.4集合類型2、索引表類型DECLARE
TYPEArrISTABLEOFVARCHAR(100)INDEXBYINT;
xArr;BEGIN
x(1):='TEST1';
x(2):='TEST2';
x(3):=x(1)||x(2);PRINTx(3);END;/6.1.4集合類型3、嵌套表類型嵌套表類似于一維數(shù)組,但與數(shù)組不同的是,嵌套表不需要指定元素的個數(shù),其大小可自動擴展。嵌套表元素的下標(biāo)從1開始。定義嵌套表的語法格式如下所示:TYPE<嵌套表名>ISTABLEOF<元素數(shù)據(jù)類型>;6.1.4集合類型3、嵌套表類型【案例6-6】定義一個嵌套表,其結(jié)構(gòu)與SCH_FACTORY.STAFF表相同,用來存放部門號為100001職工的信息。然后打印第1個元素的“姓名”。6.1.4集合類型3、嵌套表類型DECLARE TYPEInfo_tISTABLEOFSCH_FACTORY.STAFF%ROWTYPE; infoInfo_t;BEGIN SELECT職工號,姓名,性別,年齡,電話號碼,籍貫,部門號BULKCOLLECTINTOinfoFROMSCH_FACTORY.STAFFWHERE部門號=100001; PRINT(info(1).姓名);END;/6.1.5操作符1、算術(shù)操作符2、關(guān)系操作符3、比較操作符4、邏輯操作符6.1.5操作符1、算術(shù)操作符操作符對應(yīng)操作+加-減*乘/除6.1.5操作符2、關(guān)系操作符操作符對應(yīng)操作<小于<=小于或等于>大于>=大于或等于=等于!=不等于<>不等于:=賦值6.1.5操作符3、比較操作符操作符對應(yīng)操作ISNULL如果操作數(shù)為NULL,返回TRUELIKE比較字符串值BETWEEN驗證值是否在范圍之內(nèi)IN驗證操作數(shù)是否在設(shè)定的一系列值中6.1.5操作符4、邏輯操作符操作符對應(yīng)操作AND兩個條件都必須滿足OR只要滿足兩個條件中的一個NOT取反數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.2常用的系統(tǒng)函數(shù)0102字符串函數(shù)數(shù)值函數(shù)0304空值判斷函數(shù)日期時間函數(shù)05類型轉(zhuǎn)換函數(shù)01.數(shù)值函數(shù)函數(shù)名功能簡要說明ABS(n)求數(shù)值n的絕對值SIN(n)求數(shù)值n的正弦值COS(n)求數(shù)值n的余弦值GREATEST(n1,n2,n3)求n1、n2和n3三個數(shù)中最大的一個LEAST(n1,n2,n3)求n1、n2和n3三個數(shù)中最小的一個ROUND(n[,m])求四舍五入值函數(shù)在DM8中數(shù)值函數(shù)接受數(shù)值參數(shù)并返回數(shù)值作為結(jié)果,下列表格中展示了常用的數(shù)值函數(shù)。02.字符串函數(shù)函數(shù)名功能簡要說明ASCII(char)返回字符對應(yīng)的整數(shù)UCASE(char)將小寫的字符串轉(zhuǎn)換為大寫的字符串UPPER(char)將小寫的字符串轉(zhuǎn)換為大寫的字符串STRPOSDEC(char)把字符串char中最后一個字符的值減一STRPOSDEC(char,pos)把字符串char中指定位置pos上的字符值減一STRPOSINC(char)把字符串char中最后一個字符的值加一STRPOSINC(char,pos)把字符串char中指定位置pos上的字符值加一在DM8中字符串函數(shù)一般接受字符類型(包括CHAR和VARCHAR)和數(shù)值類型的參數(shù),返回值一般是字符類型或是數(shù)值類型,下列表格中展示了常用的字符串函數(shù)。03.日期時間函數(shù)函數(shù)名功能簡要說明CURDATE()返回系統(tǒng)當(dāng)前日期CURTIME(n)返回系統(tǒng)當(dāng)前時間DAY(date)返回日期中的天數(shù)DAYNAME(date)返回日期的星期名稱GREATEST(date1,date2,date3)求date1、date2和date3中的最大日期GREAT(date1,date2)求date1、date2中的最大日期在DM8中日期時間函數(shù)的參數(shù)至少有一個是日期時間類型(TIME,DATE,TIMESTAMP),返回值一般為日期時間類型和數(shù)值類型,下列表格中展示了常用的日期時間函數(shù)。04.空值判斷函數(shù)函數(shù)名功能簡要說明COALESCE(n1,n2,…nx)返回第一個非空的值IFNULL(n1,n2)當(dāng)n1為非空時,返回n1;若n1為空,則返回n2ISNULL(n1,n2)當(dāng)n1為非空時,返回n1;若n1為空,則返回n2NULLIF(n1,n2)如果n1=n2返回NULL,否則返回n1NVL(n1,n2)返回第一個非空的值NULL_EQU返回兩個類型相同的值的比較在DM8中空值判斷函數(shù)用于判斷參數(shù)是否為NULL,或根據(jù)參數(shù)返回NULL,下列表格中展示了常用的空值判斷函數(shù)。05.類型轉(zhuǎn)換函數(shù)函數(shù)名功能簡要說明CAST(valueAStype)將value轉(zhuǎn)換為指定的類型CONVERT(type,value)將value轉(zhuǎn)換為指定的類型HEXTORAW(exp)將exp轉(zhuǎn)換為BLOB類型RAWTOHEX(exp)將exp轉(zhuǎn)換為VARCHAR類型BINTOCHAR(exp)將exp轉(zhuǎn)換為CHARTO_BLOB(value)將value轉(zhuǎn)換為blobUNHEX(exp)將十六進制的exp轉(zhuǎn)換為格式字符串HEX(exp)將字符串的exp轉(zhuǎn)換為十六進制字符串下列表格中展示了常用的類型轉(zhuǎn)換函數(shù)。數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.3存儲過程的定義及管理0102調(diào)用存儲過程定義存儲過程03刪除存儲過程6.3.1定義存儲過程定義存儲過程的語法如下所示:CREATE[ORREPLACE]PROCEDURE<過程聲明><AS_OR_IS><模塊體>6.3.1定義存儲過程過程聲明的語法說明如下所示:<過程聲明>::=<存儲過程名定義>[WITHENCRYPTION][(<參數(shù)名><參數(shù)模式><參數(shù)類型>[<默認值表達式>]{,<參數(shù)名><參數(shù)模式><參數(shù)類型>[<默認值表達式>]})][<調(diào)用權(quán)限子句>]<存儲過程名定義>::=[<模式名>.]<存儲過程名>AS_OR_IS可以為AS或者IS,語法如下所示:<AS_OR_IS>::=AS|IS6.3.1定義存儲過程模塊體的語法說明如下所示:<模塊體>::=[<聲明部分>]BEGIN<執(zhí)行部分>[<異常處理部分>]END[存儲過程名]<聲明部分>::=[DECLARE]<聲明定義>{<聲明定義>}<聲明定義>::=<變量聲明>|<異常變量聲明>|<游標(biāo)定義>|<子過程定義>|<子函數(shù)定義>;<執(zhí)行部分>::=<DMSQL程序語句序列>{;<DMSQL程序語句序列>}<DMSQL程序語句序列>::=[<<<標(biāo)號名>>>]<DMSQL程序語句>;<DMSQL程序語句>::=<SQL語句>|<控制語句><異常處理部分>::=EXCEPTION<異常處理語句>{;<異常處理語句>}6.3.1定義存儲過程可執(zhí)行部分是存儲過程的核心部分,由SQL語句和流控制語句構(gòu)成。支持的SQL語句如下:數(shù)據(jù)查詢語句(SELECT)數(shù)據(jù)操縱語句(INSERT、DELETE、UPDATE)游標(biāo)定義及操縱語句(DECLARECURSOR、OPEN、FETCH、CLOSE)事務(wù)控制語句(COMMIT、ROLLBACK)動態(tài)SQL執(zhí)行語句(EXECUTEIMMEDIATE)6.3.1定義存儲過程【案例6-7】在模式SCH_FACTORY下創(chuàng)建一個名為proc_1的存儲過程,輸入?yún)?shù)a及輸出類型為INT。設(shè)置一個參數(shù)b類型為INT賦值為10,計算輸入?yún)?shù)a與參數(shù)b的和并輸出。CREATEORREPLACEPROCEDURESCH_FACTORY.proc_1(aINOUTINT)AS
bINT:=10;BEGIN
a:=a+b;
PRINTa;END;/6.3.2調(diào)用存儲過程對存儲過程的調(diào)用可通過CALL語句來完成,也可以什么也不加直接通過名字及相應(yīng)的參數(shù)執(zhí)行即可,兩種方式?jīng)]有區(qū)別。6.3.2調(diào)用存儲過程【案例6-8】調(diào)用在【案例引用】中在模式SCH_FACOTRY下創(chuàng)建的proc_1的存儲過程,參數(shù)為10。CALLSCH_FACOTRY.proc_1(10);SCH_FACOTRY.proc_1(10);6.3.3刪除存儲過程當(dāng)用戶需要從數(shù)據(jù)庫中刪除一個存儲過程時,可以使用存儲過程刪除語句。其語法如下所示:DROPPROCEDURE<存儲過程名定義>;<存儲過程名定義>::=[<模式名>.]<存儲過程名>當(dāng)模式名缺省時,默認為刪除當(dāng)前模式下的存儲過程,否則,應(yīng)指明存儲模塊所屬的模式。除了DBA用戶外,其他用戶只能刪除自己創(chuàng)建的存儲過程。6.3.3刪除存儲過程【案例6-9】刪除在模式SCH_FACTORY下創(chuàng)建的名為proc_1的存儲過程。DROPPROCEDURESCH_FACTORY.proc_1;數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.4存儲函數(shù)的定義及管理0102調(diào)用存儲函數(shù)定義存儲函數(shù)03刪除存儲函數(shù)6.4.1定義存儲函數(shù)定義存儲函數(shù)的語法如下所示:CREATE[ORREPLACE]FUNCTION<函數(shù)聲明><AS_OR_IS><模塊體>6.4.1定義存儲函數(shù)過程聲明的語法說明如下所示:<函數(shù)聲明>::=<存儲函數(shù)名定義>[WITHENCRYPTION][FORCALCULATE][(<參數(shù)名><參數(shù)模式><參數(shù)類型>[<默認值表達式>]{,<參數(shù)名><參數(shù)模式><參數(shù)類型>[<默認值表達式>]})]RETURN<返回數(shù)據(jù)類型>[<調(diào)用選項子句>][PIPELINED]<存儲函數(shù)名定義>::=[<模式名>.]<存儲函數(shù)名><調(diào)用選項子句>::=<調(diào)用選項>{<調(diào)用選項>}<調(diào)用選項>::=<調(diào)用權(quán)限子句>|DETERMINISTIC6.4.1定義存儲函數(shù)模塊體的語法說明如下所示:<模塊體>::=[<聲明部分>]BEGIN<執(zhí)行部分>[<異常處理部分>]END[存儲函數(shù)名]<聲明部分>::=[DECLARE]<聲明定義>{<聲明定義>}<聲明定義>::=<變量聲明>|<異常變量聲明>|<游標(biāo)定義>|<子過程定義>|<子函數(shù)定義>;<執(zhí)行部分>::=<DMSQL程序語句序列>{;<DMSQL程序語句序列>}<DMSQL程序語句序列>::=[<標(biāo)號說明>]<DMSQL程序語句>;<標(biāo)號說明>::=<<<標(biāo)號名>>><DMSQL程序語句>::=<SQL語句>|<控制語句><異常處理部分>::=EXCEPTION<異常處理語句>{;<異常處理語句>}6.4.1定義存儲函數(shù)【案例6-10】在模式SCH_FACTORY下創(chuàng)建一個名為fun_1的存儲函數(shù)。函數(shù)的兩個輸入?yún)?shù)a,b類型為INT,返回參數(shù)s類型為INT。最后將a、b的和進行返回。CREATEORREPLACEFUNCTIONSCH_FACTORY.fun_1(aINT,bINT)RETURNINTAS
sINT;BEGIN
s:=a+b;
RETURNs;EXCEPTION
WHENOTHERSTHENNULL;END;/6.4.2調(diào)用存儲函數(shù)調(diào)用存儲函數(shù),除了可以通過CALL語句和直接通過名字調(diào)用外,還可以通過SELECT語句來調(diào)用,且執(zhí)行方式存在以下區(qū)別。通過CALL和直接使用名字調(diào)用存儲函數(shù)時,不會返回函數(shù)的返回值,僅執(zhí)行其中的操作;通過SELECT語句調(diào)用存儲函數(shù)時,不僅會執(zhí)行其中的操作,還會返回函數(shù)的返回值。SELECT調(diào)用的存儲函數(shù)不支持含有OUT、INOUT模式的參數(shù)。6.4.2調(diào)用存儲函數(shù)【案例6-11】調(diào)用案例6-10中在模式SCH_FACTORY下創(chuàng)建的一個名為fun_1的存儲函數(shù),存儲函數(shù)的輸入?yún)?shù)為1和3。CALLSCH_FACTORY.fun_1(1,3);SELECTSCH_FACTORY.fun_1(1,3);6.4.3刪除存儲函數(shù)當(dāng)用戶需要從數(shù)據(jù)庫中刪除一個存儲函數(shù)時,可以使用存儲函數(shù)刪除語句。其語法如下所示:DROPFUNCTION<存儲函數(shù)名定義>;<存儲函數(shù)名定義>::=[<模式名>.]<存儲函數(shù)名>6.4.3刪除存儲函數(shù)【案例6-12】刪除模式SCH_FACTORY下創(chuàng)建的名為fun_1的存儲函數(shù)。DROPFUNCTIONSCH_FACTORY.fun_1;數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.5觸發(fā)器設(shè)置及管理0203事件觸發(fā)器表級觸發(fā)器04時間觸發(fā)器01觸發(fā)器的使用6.5.1觸發(fā)器的使用觸發(fā)器(TRIGGER)定義為當(dāng)某些與數(shù)據(jù)庫有關(guān)的事件發(fā)生時,數(shù)據(jù)庫應(yīng)該采取的操作。這些事件包括全局對象、數(shù)據(jù)庫下某個模式、模式下某個基表上的INSERT、DELETE和UPDATE操作。觸發(fā)器是應(yīng)用程序分割技術(shù)的一個基本組成部分,它將事務(wù)規(guī)則從應(yīng)用程序的代碼中移到數(shù)據(jù)庫中,從而可確保加強這些事務(wù)規(guī)則并提高它們的性能。觸發(fā)器中可以定義變量,但是必須以DECLARE開頭。需要說明的是,在DM的數(shù)據(jù)守護環(huán)境下,備庫上定義的觸發(fā)器是不會被觸發(fā)的。6.5.2表級觸發(fā)器用戶可使用觸發(fā)器定義語句(CREATETRIGGER)在一張基表上創(chuàng)建表觸發(fā)器。表級觸發(fā)器定義語句的語法如下。CREATE[ORREPLACE]TRIGGER[<模式名>.]<觸發(fā)器名>[WITHENCRYPTION]<觸發(fā)限制描述>[REFERENCING<trig_referencing_list>][FOREACH{ROW|STATEMENT}][WHEN(<條件表達式>)]<觸發(fā)器體>6.5.2表級觸發(fā)器<trig_referencing_list>::=<referencing_1>|<referencing_2><referencing_1>::=OLD[ROW][AS]<引用變量名>[NEW[ROW][AS]<引用變量名>]<referencing_2>::=NEW[ROW][AS]<引用變量名>[OLD[ROW][AS]<引用變量名>]<觸發(fā)限制描述>::=<觸發(fā)限制描述1>|<觸發(fā)限制描述2><觸發(fā)限制描述1>::=<BEFORE|AFTER><觸發(fā)事件列表>[LOCAL]ON<觸發(fā)表名><觸發(fā)限制描述2>::=INSTEADOF<觸發(fā)事件列表>[LOCAL]ON<觸發(fā)視圖名><觸發(fā)事件列表>::=<觸發(fā)事件>|{<觸發(fā)事件列表>OR<觸發(fā)事件>}<觸發(fā)表名>::=[<模式名>.]<基表名><觸發(fā)事件>::=INSERT|DELETE|{UPDATE|{UPDATE0F<觸發(fā)列清單>}}6.5.2表級觸發(fā)器語法的相關(guān)參數(shù)如下。①<觸發(fā)器名>指明被創(chuàng)建的觸發(fā)器的名稱;②BEFORE指明觸發(fā)器在執(zhí)行觸發(fā)語句之前激發(fā);③AFTER指明觸發(fā)器在執(zhí)行觸發(fā)語句之后激發(fā);④INSTEADOF指明觸發(fā)器執(zhí)行時替換原始操作;⑤<觸發(fā)事件>指明激發(fā)觸發(fā)器的事件。INSTEADOF中不支持{UPDATEOF<觸發(fā)列清單>};⑥<基表名>指明被創(chuàng)建觸發(fā)器的基表的名稱;⑦WITHENCRYPTION選項,指定是否對觸發(fā)器定義進行加密;⑧REFERENCING子句指明相關(guān)名稱可以在元組級觸發(fā)器的觸發(fā)器體和WHEN子句中利用相關(guān)名稱來訪問當(dāng)前行的新值或舊值,缺省的相關(guān)名稱為OLD和NEW;⑨<引用變量名>標(biāo)識符,指明行的新值或舊值的相關(guān)名稱;⑩FOREACH子句指明觸發(fā)器為元組級或語句級觸發(fā)器。FOREACHROW表示為元組級觸發(fā)器,它受觸發(fā)命令影響且WHEN子句的表達式計算為真的每條記錄觸發(fā)一次。FOREACHSTATEMENT為語句級觸發(fā)器,它受觸發(fā)命令影響且每個觸發(fā)命令只觸發(fā)執(zhí)行一次。FOREACH子句缺省則為語句級觸發(fā)器;?WHEN子句只允許為元組級觸發(fā)器指定WHEN子句,它包含一個布爾表達式,當(dāng)表達式的值為TRUE時,執(zhí)行觸發(fā)器;否則,跳過該觸發(fā)器;?<觸發(fā)器體>觸發(fā)器被觸發(fā)時執(zhí)行的SQL過程語句塊。6.5.3事件觸發(fā)器用戶可使用觸發(fā)器定義語句(CREATETRIGGER)在數(shù)據(jù)庫全局對象上創(chuàng)建事件觸發(fā)器。事件觸發(fā)器定義語句的語法如下。CREATE[ORREPLACE]TRIGGER[<模式名>.]<觸發(fā)器名>[WITHENCRYPTION]
BEFORE|AFTER<觸發(fā)事件子句>ON<觸發(fā)對象名>[WHEN<條件表達式>]<觸發(fā)器體>6.5.3事件觸發(fā)器<觸發(fā)事件子句>:=<DDL事件子句>|<系統(tǒng)事件子句><DDL事件子句>:=<DDL事件>{OR<DDL事件>}<DDL事件>:=DDLI<<CREATE>|<ALTER>|<DROP>|<GRANT>|<REVOKE>|<TRUNCATE>|<COMMENT>><系統(tǒng)事件子句>:=<系統(tǒng)事件>{OR<系統(tǒng)事件>}<系統(tǒng)事件>:=<L0GIN>|<LOGOUT>|<SERERR>|<BACKUPDATABASE>|<RESTOREDATABASE>I<AUDIT>|<NOAUDIT>|<TIMER>|<STARTUP>|<SHUTDOWN><觸發(fā)對象名>:=[<模式名>.]SCHEMA|DATABASE6.5.3事件觸發(fā)器觸發(fā)器定義語句中相關(guān)參數(shù)的說明如下。①<模式名>指明被創(chuàng)建的觸發(fā)器的所在的模式名稱或觸發(fā)事件發(fā)生的對象所在的模式名,缺省為當(dāng)前模式;②<觸發(fā)器名>指明被創(chuàng)建的觸發(fā)器的名稱;③BEFORE指明觸發(fā)器在執(zhí)行觸發(fā)語句之前激發(fā);④AFTER指明觸發(fā)器在執(zhí)行觸發(fā)語句之后激發(fā);⑤<DDL事件子句>指明激發(fā)觸發(fā)器的DDL事件,可以是DDL或CREATE、ALTER、DROP、GRANT、REVOKE、TRUNCATE、COMMENT等;⑥<系統(tǒng)事件子句>LOGIN/LOGON、LOGOUT/LOGOFF、SERERR、BACKUPDATABASE、RESTOREDATABASE、AUDIT、NOAUDIT、TIMER、STARTUP、SHUTDOWN;⑦WITHENCRYPTION選項,指定是否對觸發(fā)器定義進行加密;⑧WHEN子句只允許為元組級觸發(fā)器指定WHEN子句,它包含一個布爾表達式,當(dāng)表達式的值為TRUE時,執(zhí)行觸發(fā)器;否則,跳過該觸發(fā)器;⑨<觸發(fā)器體>觸發(fā)器被觸發(fā)時執(zhí)行的SQL過程語句塊。6.5.4時間觸發(fā)器時間觸發(fā)器屬于一種特殊的事件觸發(fā)器,它使得用戶可以定義一些有規(guī)律性執(zhí)行的、定點執(zhí)行的任務(wù),比如在晚上服務(wù)器負荷輕的時候通過時間觸發(fā)器做一些更新統(tǒng)計信息的操作、自動備份操作等等,因此時間觸發(fā)器是非常有用的。時間觸發(fā)器定義語句的語法如下。CREATE[ORREPLACE]TRIGGER[<模式名>.]<觸發(fā)器名>[WITHENCRYPTION]AFTERTIMERONDATABASE<{FORONCEATDATETIME[時間表達式]<exec_ep_seqno>}|{{<month_rate>|<week_rate>|<day_rate>}{once_in_day|times_in_day}{during_date}<exec_ep_seqno>}>[WHEN<條件表達式>]<觸發(fā)器體>6.5.4時間觸發(fā)器<month_rate>:={FOREACH<整型變量>MONTH{day_in_month}}|{FOREACH<整型變量>MONTH{day_in_month_week}}<day_in_month>:=DAY<整型變量><day_in_month_week>:={DAY<整型變量>OFWEEK<整型變量>}|{DAY<整型變量>OFWEEKLAST}<week_rate>:=FOREACH<整型變量>WEEK{day_of_week_list}<day_of_week_list>:={<整型變量>}|{,<整型變量>}<day_rate>:=FOREACH<整型變量>DAY<once_in_day>:=ATTIME<時間表達式><times_in_day>:={duaringtime}FOREACH<整型變量>MINUTE<duaring_time>:={NULL}|{FROMTIME<時間表達式>}|{FROMTIME<時間表達式>TOTIME<時間表達式>}<duaring_date>:={NULL}|{FROMDATETIME<日期時間表達式>}|{FROMDATETIME<日期時間表達式>TODATETIME<日期時間表達式>}<exec_ep_seqno>:=EXECUTEAT<整型變量>6.5.4時間觸發(fā)器時間觸發(fā)器定義語句中有下面的主要參數(shù)。①<模式名>指明被創(chuàng)建的觸發(fā)器的所在的模式名稱或觸發(fā)事件發(fā)生的對象所在的模式名,缺省為當(dāng)前模式;②<觸發(fā)器名>指明被創(chuàng)建的觸發(fā)器的名稱;③WHEN子句包含一個布爾表達式,當(dāng)表達式的值為TRUE時,執(zhí)行觸發(fā)器;否則,跳過該觸發(fā)器;④<觸發(fā)器體>觸發(fā)器被觸發(fā)時執(zhí)行的SQL過程語句塊;⑤<exec_ep_seqno>指定DMDSC環(huán)境下觸發(fā)器執(zhí)行所在的節(jié)點號。
時間觸發(fā)器的最低時間頻率精確到分鐘級,定義很靈活,完全可以實現(xiàn)數(shù)據(jù)庫中的代理功能,只要通過定義一個相應(yīng)的時間觸發(fā)器即可。在觸發(fā)器體中定義要做的工作,可以定義操作的包括執(zhí)行一段SQL語句、執(zhí)行數(shù)據(jù)庫備份、執(zhí)行重組B樹、執(zhí)行更新統(tǒng)計信息、執(zhí)行數(shù)據(jù)遷移(DTS)。數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.6掌握DMSQL程序中的控制結(jié)構(gòu)0203循環(huán)控制結(jié)構(gòu)分支結(jié)構(gòu)04順序結(jié)構(gòu)01語句塊05其他語句6.6.1語句塊語句塊是DMSQL程序的基本單元。每個語句塊由關(guān)鍵字DECLARE、BEGIN、EXCEPTION和END劃分為聲明部分、執(zhí)行部分和異常處理部分。其中執(zhí)行部分是必需的,說明和異常處理部分可以省略。語句塊可以嵌套,它可以出現(xiàn)在任何其他語句可以出現(xiàn)的位置。[DECLARE<變量說明>{,<變量說明>};]BEGIN<執(zhí)行部分>[<異常處理部分>]END6.6.2分支結(jié)構(gòu)分支結(jié)構(gòu)先執(zhí)行一個判斷條件,根據(jù)判斷條件的執(zhí)行結(jié)果執(zhí)行對應(yīng)的一系列語句。IF語句CASE語句SWITCH語句分支結(jié)構(gòu)6.6.2分支結(jié)構(gòu)-IF語句IF語句控制執(zhí)行基于布爾條件的語句序列,以實現(xiàn)條件分支控制結(jié)構(gòu)。IF<條件表達式>THEN<執(zhí)行部分>;[<ELSEIF_OR_ELSIF><條件表達式>THEN<執(zhí)行部分>;{<ELSEIF__OR_ELSIF><條件表達式>THEN<執(zhí)行部分>;}][ELSE<執(zhí)行部分>;]ENDIF;<ELSEIF_OR_ELSIF>::=ELSEIF|ELSIF6.6.2分支結(jié)構(gòu)-IF語句IF條件THEN
代碼ENDIF;IF條件THEN
代碼1ELSE
代碼2ENDIF;IF條件1THEN
代碼1ELSEIF條件2THEN
代碼2…ELSE
代碼NENDIF6.6.2分支結(jié)構(gòu)-CASE語句CASE語句從系列條件中進行選擇,并且執(zhí)行相應(yīng)的語句塊,主要有下面兩種形式:(1)簡單形式:將一個表達式與多個值進行比較,語法如下:CASE<條件表達式>WHEN<條件>THEN<執(zhí)行部分>;{WHEN<條件>THEN<執(zhí)行部分>;}[ELSE<執(zhí)行部分>]END[CASE];(2)搜索形式:對多個條件進行計算,取第一個結(jié)果為真的條件,語法如下。CASEWHEN<條件表達式>THEN<執(zhí)行部分>;{WHEN<條件表達式>THEN<執(zhí)行部分>;}[ELSE<執(zhí)行部分>]END[CASE];6.6.2分支結(jié)構(gòu)-SWITCH語句DMSQL程序支持C語法風(fēng)格的SWITCH分支結(jié)構(gòu)語句,SWITCH語句的功能與簡單形式的CASE語句類似,用于將一個表達式與多個值進行比較,并執(zhí)行相應(yīng)的語句塊,語法如下:SWITCH(<條件表達式>){CASE<常量表達式>:<執(zhí)行部分>;BREAK;{CASE<常量表達式>:<執(zhí)行部分>;BREAK;}[DEFAULT:<執(zhí)行部分>;]}6.6.3循環(huán)控制結(jié)構(gòu)FORALL語句REPEAT語句FOR語句WHILE語句05040302循環(huán)控制結(jié)構(gòu)LOOP語句016.6.3循環(huán)控制結(jié)構(gòu)-LOOP語句LOOP語句是基本類型的循環(huán)語句,LOOP語句循環(huán)重復(fù)執(zhí)行一系列語句,直到EXIT語句終止循環(huán)為止。LOOP<執(zhí)行部分>;ENDLOOP[標(biāo)號名];LOOP語句實現(xiàn)對一語句系列的重復(fù)執(zhí)行,是循環(huán)語句的最簡單形式。LOOP和ENDLOOP之間的執(zhí)行部分將無限次地執(zhí)行,必須借助EXIT、GOTO或RAISE語句來跳出循環(huán)。6.6.3循環(huán)控制結(jié)構(gòu)-WHILE語句WHILE<條件表達式>LOOP<執(zhí)行部分>;ENDLOOP[標(biāo)號名];WHILE語句是基本類型的循環(huán)語句,WHILE語句循環(huán)檢測一個條件表達式,當(dāng)表達式的值為TRUE時就執(zhí)行循環(huán)體的語句序列。WHILE循環(huán)語句在每次循環(huán)開始之前,先計算條件表達式,若該條件為TRUE,執(zhí)行部分被執(zhí)行一次,然后控制重新回到循環(huán)頂部。若條件表達式的值為FALSE,則結(jié)束循環(huán)。當(dāng)然,也可以通過EXIT語句來終止循環(huán)。6.6.3循環(huán)控制結(jié)構(gòu)-FOR語句FOR語句是基本類型的循環(huán)語句,F(xiàn)OR語句對一系列的語句重復(fù)執(zhí)行指定次數(shù)的循環(huán)。FOR<循環(huán)計數(shù)器>IN[REVERSE]<下限表達式>..<.上限表達式>LOOP<執(zhí)行部分>;ENDLOOP[標(biāo)號名];循環(huán)計數(shù)器是一個標(biāo)識符,它類似于一個變量,但是不能被賦值,且作用域限于FOR語句內(nèi)部。下限表達式和上限表達式用來確定循環(huán)的范圍,它們的類型必須和整型兼容。循環(huán)次數(shù)是在循環(huán)開始之前確定的,即使在循環(huán)過程中下限表達式或上限表達式的值發(fā)生了改變,也不會引起循環(huán)次數(shù)的變化。6.6.3循環(huán)控制結(jié)構(gòu)-REPEAT語句REPEAT語句是基本類型的循環(huán)語句,REPEAT語句重復(fù)執(zhí)行一系列語句直至達到條件表達式的限制要求。REPEAT<執(zhí)行部分>;UNTIL<條件表達式>;REPEAT語句先執(zhí)行<執(zhí)行部分>,然后判斷<條件表達式>,若為TRUE則控制重新回到循環(huán)頂部,若為FALSE則退出循環(huán)??梢钥闯?,REPEAT語句的執(zhí)行部分至少會執(zhí)行一次。6.6.3循環(huán)控制結(jié)構(gòu)-FORALL語句FORALL語句對一條DML語句執(zhí)行多次,當(dāng)DML語句中使用數(shù)組或嵌套表時可進行優(yōu)化處理,能大幅提升性能。FORALL<循環(huán)計數(shù)器>IN<bounds_clause>[SAVEEXCEPTIONS]<fora11_dml_stmt>;<bounds_clause>::=<下限表達式>..<上限表達式>|INDICESOF<集合>[BETWEEN]<下限表達式>AND<上限表達式>|VALUESOF<集合><forall_dml_stmt>::=<INSERT語句>|<UPDATE語句>|<DELETE語句>|<MERGEINTO語句>6.6.4順序結(jié)構(gòu)GOTO語句NULL語句順序結(jié)構(gòu)GOTO語句的作用是無條件地跳轉(zhuǎn)到一個標(biāo)號名所在的位置,其語法為:GOTO<標(biāo)號名>;NULL語句不做任何事情,只是用于保證語法的正確性,或增加程序的可讀性。NULL語句的語法為:NULL;6.6.5其他語句<賦值對象>:=<值表達式>;或SET<賦值對象>=<值表達式>;賦值語句[CALL][<模式名>.]<存儲模塊名>[@dblink_name][(<參數(shù)>{,<參數(shù)>})];<參數(shù)>:=<參數(shù)值>|<參數(shù)名=參數(shù)值>調(diào)用語句RETURN[<返回值>];RETURN語句PIPEROW(<值表達式>);PIPEROW語句PRINT<表達式>;PRINT語句數(shù)據(jù)庫基礎(chǔ)(基于達夢DM8)數(shù)據(jù)庫程序設(shè)計66.7游標(biāo)的使用0203游標(biāo)變量(引用游標(biāo))動態(tài)游標(biāo)04使用游標(biāo)FOR循環(huán)01靜態(tài)游標(biāo)6.7.1靜態(tài)游標(biāo)靜態(tài)游標(biāo)是只讀游標(biāo),它總是按照打開游標(biāo)時的原樣顯示結(jié)果集,在編譯時就能確定靜態(tài)游標(biāo)使用的查詢。靜態(tài)游標(biāo)隱式游標(biāo)顯式游標(biāo)6.7.1靜態(tài)游標(biāo)-隱式游標(biāo)隱式游標(biāo)無須用戶進行定義,每當(dāng)用戶在DMSQL程序中執(zhí)行一個DML語句(INSERT、UPDATE、DELETE)或者SELECT...INTO語句時,DMSQL程序都會自動聲明一個隱式游標(biāo)并管理這個游標(biāo)。隱式游標(biāo)的名稱為“SQL”,用戶可以通過隱式游標(biāo)獲取語句執(zhí)行的一些信息。DMSQL程序中的每個游標(biāo)都有號%FOUND、%NOTFOUND、%ISOPEN和%ROWCOUNT四個屬性,對于隱式游標(biāo),這四個屬性的意義如下:6.7.1靜態(tài)游標(biāo)-隱式游標(biāo)%FOUND:語句是否修改或查詢到了記錄,是返回TRUE,否則返回FALSE;%NOTFOUND:語句是否未能成功修改或查詢到記錄,是返回TRUE,否則返回FALSE;%ISOPEN:游標(biāo)是否打開。是返回TRUE,否返回FALSE。由于系統(tǒng)在語句執(zhí)行完成后會自動關(guān)閉隱式游標(biāo),因此隱式游標(biāo)的各ISOPEN屬性永遠為FALSE;%ROWCOUNT:DML語句執(zhí)行影響的行數(shù),或SELECT...INTO語句返回的行數(shù)。6.7.1靜態(tài)游標(biāo)-顯式游標(biāo)顯式游標(biāo)指向一個查詢語句執(zhí)行后的結(jié)果集區(qū)域。當(dāng)需要處理返回多條記錄的查詢時,應(yīng)顯式地定義游標(biāo)以處理結(jié)果集地每一行。使用顯式游標(biāo)一般包括下面幾個步驟:1)定義游標(biāo):在DMSQL程序的聲明部分定義游標(biāo),聲明游標(biāo)及其關(guān)聯(lián)的查詢語句;2)打開游標(biāo):執(zhí)行游標(biāo)關(guān)聯(lián)的語句,將查詢結(jié)果裝入游標(biāo)工作區(qū),將游標(biāo)定位到結(jié)果集的第一行之前;3)撥動游標(biāo):根據(jù)應(yīng)用需要將游標(biāo)位置移動到結(jié)果集的合適位置;4)關(guān)閉游標(biāo):游標(biāo)使用完后應(yīng)關(guān)閉,以釋放其占有的資源。6.7.1靜態(tài)游標(biāo)-顯式游標(biāo)1)定義游標(biāo):在DMSQL程序的聲明部分定義游標(biāo),聲明游標(biāo)及其關(guān)聯(lián)的查詢語句;CURSOR<游標(biāo)名>[FAST|NOFAST]<cursor選項>;或<游標(biāo)名>CURSOR[FAST|NOFAST]<cursor選項>;必須先定義一個游標(biāo),之后才能在別的語句中使用它。定義顯式游標(biāo)時指定游標(biāo)名和與其關(guān)聯(lián)的查詢語句??梢灾付ㄓ螛?biāo)的返回類型,也可以指定關(guān)聯(lián)的查詢語句中的WHERE子句使用的參數(shù)。6.7.1靜
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版商業(yè)租賃協(xié)議標(biāo)準(zhǔn)版版A版
- 二零二五版廣東省土地估價師協(xié)會土地估價師行業(yè)專業(yè)論壇合同3篇
- 二零二五版健身中心場地租賃及健身賽事舉辦合同3篇
- 二零二五年度個人合伙房地產(chǎn)合作開發(fā)合同樣本3篇
- 專業(yè)級2024型材料供銷協(xié)議3
- 天津工藝美術(shù)職業(yè)學(xué)院《電氣工程綜合實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 泰山科技學(xué)院《工作坊》2023-2024學(xué)年第一學(xué)期期末試卷
- 蘇州科技大學(xué)《韓非子》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度特種設(shè)備安全檢驗合同規(guī)范3篇
- 二零二五年高新技術(shù)企業(yè)研發(fā)補貼及合作協(xié)議2篇
- 2025寒假散學(xué)典禮(休業(yè)式)上校長精彩講話:以董宇輝的創(chuàng)新、羅振宇的堅持、馬龍的熱愛啟迪未來
- 安徽省示范高中2024-2025學(xué)年高一(上)期末綜合測試物理試卷(含答案)
- 安徽省合肥市包河區(qū)2023-2024學(xué)年九年級上學(xué)期期末化學(xué)試題
- 《酸堿罐區(qū)設(shè)計規(guī)范》編制說明
- PMC主管年終總結(jié)報告
- 售樓部保安管理培訓(xùn)
- 倉儲培訓(xùn)課件模板
- 2025屆高考地理一輪復(fù)習(xí)第七講水循環(huán)與洋流自主練含解析
- GB/T 44914-2024和田玉分級
- 2024年度企業(yè)入駐跨境電商孵化基地合作協(xié)議3篇
- 《形勢與政策》課程標(biāo)準(zhǔn)
評論
0/150
提交評論