數(shù)據(jù)庫基礎與實例教程(達夢DM8) 課件 項目6 數(shù)據(jù)庫程序設計_第1頁
數(shù)據(jù)庫基礎與實例教程(達夢DM8) 課件 項目6 數(shù)據(jù)庫程序設計_第2頁
數(shù)據(jù)庫基礎與實例教程(達夢DM8) 課件 項目6 數(shù)據(jù)庫程序設計_第3頁
數(shù)據(jù)庫基礎與實例教程(達夢DM8) 課件 項目6 數(shù)據(jù)庫程序設計_第4頁
數(shù)據(jù)庫基礎與實例教程(達夢DM8) 課件 項目6 數(shù)據(jù)庫程序設計_第5頁
已閱讀5頁,還剩108頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

數(shù)據(jù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計66.1掌握數(shù)據(jù)類型和操作符0102記錄類型%TYPE和%ROWTYPE03數(shù)組類型04集合類型05操作符6.1.1%TYPE和%ROWTYPE

在許多時候,DMSQL程序變量被用來處理存儲在數(shù)據(jù)庫表中的數(shù)據(jù)。這種情況下,變量應該擁有與表列相同的類型。如果用戶應用中有很多的變量以及DMSQL程序代碼,這種處理可能是十分耗時和容易出錯的。為了解決上述問題,DMSQL程序提供了%TYPE數(shù)據(jù)類型和%ROWTYPE數(shù)據(jù)類型。%TYPE可以將變量同表列的類型進行綁定。與%TYPE類似,%ROWTYPE將返回一個基于表定義的運算類型,它將一個記錄聲明為具有相同類型的數(shù)據(jù)庫行。在DMSQL程序設計中使用%TYPE和%ROWTYPE是一種非常好的編程風格,它使得DMSQL程序更加靈活,更適應于對數(shù)據(jù)庫的處理。6.1.1%TYPE和%ROWTYPE

定義%TYPE變量的語法片段:DECLAREV_NAMET.NAME%TYPE;BEGIN......END;/6.1.1%TYPE和%ROWTYPE

【案例6-1】設置一個與職工表姓名字段類型一致的變量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ù)據(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記錄類型記錄類型是由單行多列的標量類型構成復合類型,類似于C語言中的結構。記錄類型提供了處理獨立但又作為一個整體單元的相關變量的一種機制。定義記錄類型的語法如下所示:TYPE<記錄類型名>ISRECORD(<字段名><數(shù)據(jù)類型>[<default子句>]{,<字段名><數(shù)據(jù)類型>[<default子句>]});6.1.2記錄類型default子句的相關說明如下所示:<default子句>::=<default子句1>|<default子句2><default子句1>::=DEFAULT<缺省值><default子句2>::=:=<缺省值>通過將需要操作的表結構定義成一個記錄,可以方便地對表中的行數(shù)據(jù)進行操作。在DMSQL程序中使用記錄,需要先定義一個RECORD類型,再用該類型聲明變量,可以單獨對記錄中的字段賦值,使用點標記引用一個記錄中的字段(記錄名.字段名)6.1.2記錄類型【案例6-3】定義一個記錄類型r_staff,包含name和age兩個字段,字段類型分別對應SCH_FACTORY模式中的STAFF表中的“姓名”和“年齡”兩個字段。聲明一個該記錄類型的變量v_staff,使用點標記為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ù)組,其長度是預先定義好的,在整個程序中,一旦給定大小后就無法改變。定義靜態(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ù)組沒有指定下標,需要動態(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、索引表類型索引表提供了一種快速、方便地管理一組相關數(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ù),其大小可自動擴展。嵌套表元素的下標從1開始。定義嵌套表的語法格式如下所示:TYPE<嵌套表名>ISTABLEOF<元素數(shù)據(jù)類型>;6.1.4集合類型3、嵌套表類型【案例6-6】定義一個嵌套表,其結構與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、算術操作符2、關系操作符3、比較操作符4、邏輯操作符6.1.5操作符1、算術操作符操作符對應操作+加-減*乘/除6.1.5操作符2、關系操作符操作符對應操作<小于<=小于或等于>大于>=大于或等于=等于!=不等于<>不等于:=賦值6.1.5操作符3、比較操作符操作符對應操作ISNULL如果操作數(shù)為NULL,返回TRUELIKE比較字符串值BETWEEN驗證值是否在范圍之內(nèi)IN驗證操作數(shù)是否在設定的一系列值中6.1.5操作符4、邏輯操作符操作符對應操作AND兩個條件都必須滿足OR只要滿足兩個條件中的一個NOT取反數(shù)據(jù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計66.2常用的系統(tǒng)函數(shù)0102字符串函數(shù)數(shù)值函數(shù)0304空值判斷函數(shù)日期時間函數(shù)05類型轉換函數(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ù)值作為結果,下列表格中展示了常用的數(shù)值函數(shù)。02.字符串函數(shù)函數(shù)名功能簡要說明ASCII(char)返回字符對應的整數(shù)UCASE(char)將小寫的字符串轉換為大寫的字符串UPPER(char)將小寫的字符串轉換為大寫的字符串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)當前日期CURTIME(n)返回系統(tǒ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)當n1為非空時,返回n1;若n1為空,則返回n2ISNULL(n1,n2)當n1為非空時,返回n1;若n1為空,則返回n2NULLIF(n1,n2)如果n1=n2返回NULL,否則返回n1NVL(n1,n2)返回第一個非空的值NULL_EQU返回兩個類型相同的值的比較在DM8中空值判斷函數(shù)用于判斷參數(shù)是否為NULL,或根據(jù)參數(shù)返回NULL,下列表格中展示了常用的空值判斷函數(shù)。05.類型轉換函數(shù)函數(shù)名功能簡要說明CAST(valueAStype)將value轉換為指定的類型CONVERT(type,value)將value轉換為指定的類型HEXTORAW(exp)將exp轉換為BLOB類型RAWTOHEX(exp)將exp轉換為VARCHAR類型BINTOCHAR(exp)將exp轉換為CHARTO_BLOB(value)將value轉換為blobUNHEX(exp)將十六進制的exp轉換為格式字符串HEX(exp)將字符串的exp轉換為十六進制字符串下列表格中展示了常用的類型轉換函數(shù)。數(shù)據(jù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計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)用權限子句>]<存儲過程名定義>::=[<模式名>.]<存儲過程名>AS_OR_IS可以為AS或者IS,語法如下所示:<AS_OR_IS>::=AS|IS6.3.1定義存儲過程模塊體的語法說明如下所示:<模塊體>::=[<聲明部分>]BEGIN<執(zhí)行部分>[<異常處理部分>]END[存儲過程名]<聲明部分>::=[DECLARE]<聲明定義>{<聲明定義>}<聲明定義>::=<變量聲明>|<異常變量聲明>|<游標定義>|<子過程定義>|<子函數(shù)定義>;<執(zhí)行部分>::=<DMSQL程序語句序列>{;<DMSQL程序語句序列>}<DMSQL程序語句序列>::=[<<<標號名>>>]<DMSQL程序語句>;<DMSQL程序語句>::=<SQL語句>|<控制語句><異常處理部分>::=EXCEPTION<異常處理語句>{;<異常處理語句>}6.3.1定義存儲過程可執(zhí)行部分是存儲過程的核心部分,由SQL語句和流控制語句構成。支持的SQL語句如下:數(shù)據(jù)查詢語句(SELECT)數(shù)據(jù)操縱語句(INSERT、DELETE、UPDATE)游標定義及操縱語句(DECLARECURSOR、OPEN、FETCH、CLOSE)事務控制語句(COMMIT、ROLLBACK)動態(tài)SQL執(zhí)行語句(EXECUTEIMMEDIATE)6.3.1定義存儲過程【案例6-7】在模式SCH_FACTORY下創(chuàng)建一個名為proc_1的存儲過程,輸入?yún)?shù)a及輸出類型為INT。設置一個參數(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語句來完成,也可以什么也不加直接通過名字及相應的參數(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刪除存儲過程當用戶需要從數(shù)據(jù)庫中刪除一個存儲過程時,可以使用存儲過程刪除語句。其語法如下所示:DROPPROCEDURE<存儲過程名定義>;<存儲過程名定義>::=[<模式名>.]<存儲過程名>當模式名缺省時,默認為刪除當前模式下的存儲過程,否則,應指明存儲模塊所屬的模式。除了DBA用戶外,其他用戶只能刪除自己創(chuàng)建的存儲過程。6.3.3刪除存儲過程【案例6-9】刪除在模式SCH_FACTORY下創(chuàng)建的名為proc_1的存儲過程。DROPPROCEDURESCH_FACTORY.proc_1;數(shù)據(jù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計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)用權限子句>|DETERMINISTIC6.4.1定義存儲函數(shù)模塊體的語法說明如下所示:<模塊體>::=[<聲明部分>]BEGIN<執(zhí)行部分>[<異常處理部分>]END[存儲函數(shù)名]<聲明部分>::=[DECLARE]<聲明定義>{<聲明定義>}<聲明定義>::=<變量聲明>|<異常變量聲明>|<游標定義>|<子過程定義>|<子函數(shù)定義>;<執(zhí)行部分>::=<DMSQL程序語句序列>{;<DMSQL程序語句序列>}<DMSQL程序語句序列>::=[<標號說明>]<DMSQL程序語句>;<標號說明>::=<<<標號名>>><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ù)當用戶需要從數(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ù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計66.5觸發(fā)器設置及管理0203事件觸發(fā)器表級觸發(fā)器04時間觸發(fā)器01觸發(fā)器的使用6.5.1觸發(fā)器的使用觸發(fā)器(TRIGGER)定義為當某些與數(shù)據(jù)庫有關的事件發(fā)生時,數(shù)據(jù)庫應該采取的操作。這些事件包括全局對象、數(shù)據(jù)庫下某個模式、模式下某個基表上的INSERT、DELETE和UPDATE操作。觸發(fā)器是應用程序分割技術的一個基本組成部分,它將事務規(guī)則從應用程序的代碼中移到數(shù)據(jù)庫中,從而可確保加強這些事務規(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ā)器語法的相關參數(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子句指明相關名稱可以在元組級觸發(fā)器的觸發(fā)器體和WHEN子句中利用相關名稱來訪問當前行的新值或舊值,缺省的相關名稱為OLD和NEW;⑨<引用變量名>標識符,指明行的新值或舊值的相關名稱;⑩FOREACH子句指明觸發(fā)器為元組級或語句級觸發(fā)器。FOREACHROW表示為元組級觸發(fā)器,它受觸發(fā)命令影響且WHEN子句的表達式計算為真的每條記錄觸發(fā)一次。FOREACHSTATEMENT為語句級觸發(fā)器,它受觸發(fā)命令影響且每個觸發(fā)命令只觸發(fā)執(zhí)行一次。FOREACH子句缺省則為語句級觸發(fā)器;?WHEN子句只允許為元組級觸發(fā)器指定WHEN子句,它包含一個布爾表達式,當表達式的值為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ā)器定義語句中相關參數(shù)的說明如下。①<模式名>指明被創(chuàng)建的觸發(fā)器的所在的模式名稱或觸發(fā)事件發(fā)生的對象所在的模式名,缺省為當前模式;②<觸發(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子句,它包含一個布爾表達式,當表達式的值為TRUE時,執(zhí)行觸發(fā)器;否則,跳過該觸發(fā)器;⑨<觸發(fā)器體>觸發(fā)器被觸發(fā)時執(zhí)行的SQL過程語句塊。6.5.4時間觸發(fā)器時間觸發(fā)器屬于一種特殊的事件觸發(fā)器,它使得用戶可以定義一些有規(guī)律性執(zhí)行的、定點執(zhí)行的任務,比如在晚上服務器負荷輕的時候通過時間觸發(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ā)生的對象所在的模式名,缺省為當前模式;②<觸發(fā)器名>指明被創(chuàng)建的觸發(fā)器的名稱;③WHEN子句包含一個布爾表達式,當表達式的值為TRUE時,執(zhí)行觸發(fā)器;否則,跳過該觸發(fā)器;④<觸發(fā)器體>觸發(fā)器被觸發(fā)時執(zhí)行的SQL過程語句塊;⑤<exec_ep_seqno>指定DMDSC環(huán)境下觸發(fā)器執(zhí)行所在的節(jié)點號。

時間觸發(fā)器的最低時間頻率精確到分鐘級,定義很靈活,完全可以實現(xiàn)數(shù)據(jù)庫中的代理功能,只要通過定義一個相應的時間觸發(fā)器即可。在觸發(fā)器體中定義要做的工作,可以定義操作的包括執(zhí)行一段SQL語句、執(zhí)行數(shù)據(jù)庫備份、執(zhí)行重組B樹、執(zhí)行更新統(tǒng)計信息、執(zhí)行數(shù)據(jù)遷移(DTS)。數(shù)據(jù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計66.6掌握DMSQL程序中的控制結構0203循環(huán)控制結構分支結構04順序結構01語句塊05其他語句6.6.1語句塊語句塊是DMSQL程序的基本單元。每個語句塊由關鍵字DECLARE、BEGIN、EXCEPTION和END劃分為聲明部分、執(zhí)行部分和異常處理部分。其中執(zhí)行部分是必需的,說明和異常處理部分可以省略。語句塊可以嵌套,它可以出現(xiàn)在任何其他語句可以出現(xiàn)的位置。[DECLARE<變量說明>{,<變量說明>};]BEGIN<執(zhí)行部分>[<異常處理部分>]END6.6.2分支結構分支結構先執(zhí)行一個判斷條件,根據(jù)判斷條件的執(zhí)行結果執(zhí)行對應的一系列語句。IF語句CASE語句SWITCH語句分支結構6.6.2分支結構-IF語句IF語句控制執(zhí)行基于布爾條件的語句序列,以實現(xiàn)條件分支控制結構。IF<條件表達式>THEN<執(zhí)行部分>;[<ELSEIF_OR_ELSIF><條件表達式>THEN<執(zhí)行部分>;{<ELSEIF__OR_ELSIF><條件表達式>THEN<執(zhí)行部分>;}][ELSE<執(zhí)行部分>;]ENDIF;<ELSEIF_OR_ELSIF>::=ELSEIF|ELSIF6.6.2分支結構-IF語句IF條件THEN

代碼ENDIF;IF條件THEN

代碼1ELSE

代碼2ENDIF;IF條件1THEN

代碼1ELSEIF條件2THEN

代碼2…ELSE

代碼NENDIF6.6.2分支結構-CASE語句CASE語句從系列條件中進行選擇,并且執(zhí)行相應的語句塊,主要有下面兩種形式:(1)簡單形式:將一個表達式與多個值進行比較,語法如下:CASE<條件表達式>WHEN<條件>THEN<執(zhí)行部分>;{WHEN<條件>THEN<執(zhí)行部分>;}[ELSE<執(zhí)行部分>]END[CASE];(2)搜索形式:對多個條件進行計算,取第一個結果為真的條件,語法如下。CASEWHEN<條件表達式>THEN<執(zhí)行部分>;{WHEN<條件表達式>THEN<執(zhí)行部分>;}[ELSE<執(zhí)行部分>]END[CASE];6.6.2分支結構-SWITCH語句DMSQL程序支持C語法風格的SWITCH分支結構語句,SWITCH語句的功能與簡單形式的CASE語句類似,用于將一個表達式與多個值進行比較,并執(zhí)行相應的語句塊,語法如下:SWITCH(<條件表達式>){CASE<常量表達式>:<執(zhí)行部分>;BREAK;{CASE<常量表達式>:<執(zhí)行部分>;BREAK;}[DEFAULT:<執(zhí)行部分>;]}6.6.3循環(huán)控制結構FORALL語句REPEAT語句FOR語句WHILE語句05040302循環(huán)控制結構LOOP語句016.6.3循環(huán)控制結構-LOOP語句LOOP語句是基本類型的循環(huán)語句,LOOP語句循環(huán)重復執(zhí)行一系列語句,直到EXIT語句終止循環(huán)為止。LOOP<執(zhí)行部分>;ENDLOOP[標號名];LOOP語句實現(xiàn)對一語句系列的重復執(zhí)行,是循環(huán)語句的最簡單形式。LOOP和ENDLOOP之間的執(zhí)行部分將無限次地執(zhí)行,必須借助EXIT、GOTO或RAISE語句來跳出循環(huán)。6.6.3循環(huán)控制結構-WHILE語句WHILE<條件表達式>LOOP<執(zhí)行部分>;ENDLOOP[標號名];WHILE語句是基本類型的循環(huán)語句,WHILE語句循環(huán)檢測一個條件表達式,當表達式的值為TRUE時就執(zhí)行循環(huán)體的語句序列。WHILE循環(huán)語句在每次循環(huán)開始之前,先計算條件表達式,若該條件為TRUE,執(zhí)行部分被執(zhí)行一次,然后控制重新回到循環(huán)頂部。若條件表達式的值為FALSE,則結束循環(huán)。當然,也可以通過EXIT語句來終止循環(huán)。6.6.3循環(huán)控制結構-FOR語句FOR語句是基本類型的循環(huán)語句,F(xiàn)OR語句對一系列的語句重復執(zhí)行指定次數(shù)的循環(huán)。FOR<循環(huán)計數(shù)器>IN[REVERSE]<下限表達式>..<.上限表達式>LOOP<執(zhí)行部分>;ENDLOOP[標號名];循環(huán)計數(shù)器是一個標識符,它類似于一個變量,但是不能被賦值,且作用域限于FOR語句內(nèi)部。下限表達式和上限表達式用來確定循環(huán)的范圍,它們的類型必須和整型兼容。循環(huán)次數(shù)是在循環(huán)開始之前確定的,即使在循環(huán)過程中下限表達式或上限表達式的值發(fā)生了改變,也不會引起循環(huán)次數(shù)的變化。6.6.3循環(huán)控制結構-REPEAT語句REPEAT語句是基本類型的循環(huán)語句,REPEAT語句重復執(zhí)行一系列語句直至達到條件表達式的限制要求。REPEAT<執(zhí)行部分>;UNTIL<條件表達式>;REPEAT語句先執(zhí)行<執(zhí)行部分>,然后判斷<條件表達式>,若為TRUE則控制重新回到循環(huán)頂部,若為FALSE則退出循環(huán)??梢钥闯?,REPEAT語句的執(zhí)行部分至少會執(zhí)行一次。6.6.3循環(huán)控制結構-FORALL語句FORALL語句對一條DML語句執(zhí)行多次,當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順序結構GOTO語句NULL語句順序結構GOTO語句的作用是無條件地跳轉到一個標號名所在的位置,其語法為:GOTO<標號名>;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ù)庫基礎(基于達夢DM8)數(shù)據(jù)庫程序設計66.7游標的使用0203游標變量(引用游標)動態(tài)游標04使用游標FOR循環(huán)01靜態(tài)游標6.7.1靜態(tài)游標靜態(tài)游標是只讀游標,它總是按照打開游標時的原樣顯示結果集,在編譯時就能確定靜態(tài)游標使用的查詢。靜態(tài)游標隱式游標顯式游標6.7.1靜態(tài)游標-隱式游標隱式游標無須用戶進行定義,每當用戶在DMSQL程序中執(zhí)行一個DML語句(INSERT、UPDATE、DELETE)或者SELECT...INTO語句時,DMSQL程序都會自動聲明一個隱式游標并管理這個游標。隱式游標的名稱為“SQL”,用戶可以通過隱式游標獲取語句執(zhí)行的一些信息。DMSQL程序中的每個游標都有號%FOUND、%NOTFOUND、%ISOPEN和%ROWCOUNT四個屬性,對于隱式游標,這四個屬性的意義如下:6.7.1靜態(tài)游標-隱式游標%FOUND:語句是否修改或查詢到了記錄,是返回TRUE,否則返回FALSE;%NOTFOUND:語句是否未能成功修改或查詢到記錄,是返回TRUE,否則返回FALSE;%ISOPEN:游標是否打開。是返回TRUE,否返回FALSE。由于系統(tǒng)在語句執(zhí)行完成后會自動關閉隱式游標,因此隱式游標的各ISOPEN屬性永遠為FALSE;%ROWCOUNT:DML語句執(zhí)行影響的行數(shù),或SELECT...INTO語句返回的行數(shù)。6.7.1靜態(tài)游標-顯式游標顯式游標指向一個查詢語句執(zhí)行后的結果集區(qū)域。當需要處理返回多條記錄的查詢時,應顯式地定義游標以處理結果集地每一行。使用顯式游標一般包括下面幾個步驟:1)定義游標:在DMSQL程序的聲明部分定義游標,聲明游標及其關聯(lián)的查詢語句;2)打開游標:執(zhí)行游標關聯(lián)的語句,將查詢結果裝入游標工作區(qū),將游標定位到結果集的第一行之前;3)撥動游標:根據(jù)應用需要將游標位置移動到結果集的合適位置;4)關閉游標:游標使用完后應關閉,以釋放其占有的資源。6.7.1靜態(tài)游標-顯式游標1)定義游標:在DMSQL程序的聲明部分定義游標,聲明游標及其關聯(lián)的查詢語句;CURSOR<游標名>[FAST|NOFAST]<cursor選項>;或<游標名>CURSOR[FAST|NOFAST]<cursor選項>;必須先定義一個游標,之后才能在別的語句中使用它。定義顯式游標時指定游標名和與其關聯(lián)的查詢語句??梢灾付ㄓ螛说姆祷仡愋?,也可以指定關聯(lián)的查詢語句中的WHERE子句使用的參數(shù)。6.7.1靜

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論