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