DB2 存儲(chǔ)過(guò)程
一、什么是存儲(chǔ)過(guò)程
受 DB2 服務(wù)器控制的一段可執(zhí)行程序
可以通過(guò)SQL的CALL語(yǔ)句來(lái)完成對(duì)存儲(chǔ)過(guò)程的調(diào)用
在存儲(chǔ)過(guò)程中可以包含業(yè)務(wù)邏輯
存儲(chǔ)過(guò)程可以在本地或遠(yuǎn)程進(jìn)行調(diào)用
存儲(chǔ)過(guò)程可以接收或傳遞參數(shù),生成結(jié)果集
二、存儲(chǔ)過(guò)程特征
包含使用sql語(yǔ)句的過(guò)程構(gòu)造
存儲(chǔ)在數(shù)據(jù)庫(kù)中且在db2 服務(wù)器上運(yùn)行;
可以由正在使用的sql的應(yīng)用程序根據(jù)名稱來(lái)調(diào)用;
允許應(yīng)用程序分2部分允許,在客戶機(jī)上運(yùn)行應(yīng)用程序,在服務(wù)器上運(yùn)行存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程在應(yīng)用程序中的優(yōu)勢(shì)
減少了客戶機(jī)與服務(wù)器直接的網(wǎng)絡(luò)使用率
增強(qiáng)了硬件和軟件功能
提高了安全性
減少了開(kāi)發(fā)成本并且提高了可靠性
集中處理了公共例程的安全性、管理和維護(hù)
通過(guò)sql pl 當(dāng)前的語(yǔ)句集合和語(yǔ)言特性,可以用sql開(kāi)發(fā)綜合的、高級(jí)的程序
例如函數(shù)、存儲(chǔ)過(guò)程和觸發(fā)器。這樣便可以將業(yè)務(wù)邏輯封裝到易于維護(hù)的數(shù)據(jù)庫(kù)對(duì)象中,從而提高數(shù)據(jù)庫(kù)應(yīng)用程序的性能。
SQL PL 支持本地和全局變量,包括聲明和賦值,還支持條件語(yǔ)句和迭代語(yǔ)句、控制語(yǔ)句的轉(zhuǎn)移、錯(cuò)誤管理語(yǔ)句以及返回結(jié)果集的方法。
三、什么時(shí)候使用存儲(chǔ)過(guò)程
使用存儲(chǔ)過(guò)程的合適時(shí)機(jī):
應(yīng)用程序的性能無(wú)法滿足預(yù)期時(shí)
客戶端數(shù)量較多且應(yīng)用程序中SQL代碼分散時(shí)
應(yīng)用程序需要進(jìn)行繁重的數(shù)據(jù)庫(kù)操作,同時(shí)這些操作并不需要進(jìn)行太多的客戶交互
應(yīng)用程序代碼更改頻繁
需要對(duì)客戶應(yīng)用代碼進(jìn)行訪問(wèn)控制時(shí)
客戶應(yīng)用需要在一次操作中執(zhí)行多條 SQL 語(yǔ)句

五、數(shù)據(jù)類型
據(jù)類型.png)
字符型:char varchar
日期型 date
數(shù)字型 number decilmal integer
詳細(xì)請(qǐng)看屌絲大哥 db2數(shù)據(jù)類型介紹的那一課
六、Db2 存儲(chǔ)過(guò)程基本語(yǔ)法
6.1 存儲(chǔ)過(guò)程結(jié)構(gòu)
CREATE OR REPLACE PROCEDURE <過(guò)程名>
( [ IN | OUT | INOUT ] 參數(shù)名 數(shù)據(jù)類型 默認(rèn)值 )
LANGUAGE SQL
BEGIN
業(yè)務(wù)邏輯代碼
END;
IN(輸入?yún)?shù))
只是將實(shí)參傳遞給存儲(chǔ)過(guò)程,但在存儲(chǔ)過(guò)程中不能對(duì)其進(jìn)行修改。換句話說(shuō),對(duì)于存儲(chǔ)過(guò)程而言它是只讀的。
OUT(輸出參數(shù))
在存儲(chǔ)過(guò)程結(jié)束時(shí)向調(diào)用者返回。一般在過(guò)程中都會(huì)被賦值。
INOUT(輸入輸出參數(shù))
上述兩種參數(shù)類型的結(jié)合體。它可以幫助調(diào)用者將實(shí)參傳遞給進(jìn)程,另外它也能夠作為輸出參數(shù)被修改和賦值。
復(fù)合語(yǔ)句實(shí)例
復(fù)合語(yǔ)句是指包含在BEGIN和END間的語(yǔ)句。它一般包括如下語(yǔ)句類型:
聲明語(yǔ)句
賦值語(yǔ)句
控制語(yǔ)句
條件處理語(yǔ)句
合語(yǔ)句.png)

說(shuō)明:
1. 復(fù)合語(yǔ)句可以嵌套使用。
2. BEGIN語(yǔ)句可以和標(biāo)簽組合使用,這樣可以更清晰的標(biāo)識(shí)語(yǔ)句塊的范圍。
6.2 變量聲明與變量賦值
變量聲明語(yǔ)法:
DECLARE 變量名 數(shù)據(jù)類型 初始值;
Delcare DiaoSiName varchar(20);
變量賦值語(yǔ)法 :set 變量名=值;
例如:給屌絲姓名變量賦值。
Set DiaoSiName = ‘奶娃’;
變量聲明
DECLARE my_var INTEGER DEFAULT 6;
條件聲明
DECLARE not_found CONDITION FOR SQLSTATE ‘02000’;
游標(biāo)聲明
DECLARE c1 CURSOR FOR select * from staff;
異常處理器聲明
DECLARE EXIT HANDLER FOR SQLEXCEPTION …;
語(yǔ)法
SET lv_name = expression;
SET lv_name = NULL;
示例
(1) SET salary = salary + salary * 0.1;
(2) SET init_salary = NULL;
(3) SET salary = (select salary from employee where empno = lv_emp_num);
注: 如果 SELECT 語(yǔ)句返回記錄超過(guò)一行,示例 3 將會(huì)返回SQLERROR。


模塊 - 規(guī)格說(shuō)明(Module Specification)
模塊可以發(fā)布type, SP, UDF以供外部使用。
CREATE OR REPLACE MODULE myMod;
ALTER MODULE myMod PUBLISH
TYPE myRowTyp AS ANCHOR ROW myTab;
ALTER MODULE myMod PUBLISH
FUNCTION myFunc(val1 ANCHOR myTab.col1)
RETURNS myRowTyp;
ALTER MODULE myMod PUBLISH
PROCEDURE myProc(OUT param1 ANCHOR myTab.col2);
模塊 - 實(shí)現(xiàn)(Module Implementation)
下面的代碼是模塊的實(shí)現(xiàn)部分:
ALTER MODULE myMod ADD VARIABLE pkgVar ANCHOR myTab.col1;
ALTER MODULE myMod ADD FUNCTION myFunc(val1 ANCHOR myTab.col1) RETURNS myRowTyp
BEGIN
DECLARE var1 myRowTyp;
SELECT * INTO var1 FROM myTab WHERE col1 < val1 AND col1 > pkgVar;
RETURN var1;
END
ALTER MODULE myMod ADD PROCEDURE myProc(OUT param1 ANCHOR myTab.col2)
BEGIN
DECLARE varRow myRowTyp;
SET param1 = varRow.col2 – pkgVar;
END
模塊 - 其他語(yǔ)句
刪除整個(gè)模塊
DROP MODULE myMod;
保留規(guī)格說(shuō)明內(nèi)容,刪除實(shí)現(xiàn)
ALTER MODULE myMod DROP BODY;
刪除模塊中的存儲(chǔ)過(guò)程(SP)
ALTER MODULE myMod DROP PROCEDURE myProc;
將模塊的執(zhí)行權(quán)限賦給joe
GRANT EXECUTE ON MODULE myMod TO joe;
格式:
IF 條件1 THEN statement1;
ELSEIF 條件2 THEN statement2;
ELSE statement3;
END IF;
注:條件成立時(shí)為TRUE (真),不成立時(shí)為FALSE(假) 和 NULL
IF rating = 1 THEN
UPDATE EMPLOYEE SET salary = salary*1.10
WHERE empno = i_num;(如果滿足于...時(shí),薪水調(diào)整1.1倍)
ELSEIF rating = 2 THEN
UPDATE EMPLOYEE SET salary = salary*1.05
WHERE empno = i_num;
ELSE
UPDATE EMPLOYEE SET salary = salary*1.03
WHERE empno = i_num;
END IF;
CASE語(yǔ)句(1 of 2)
簡(jiǎn)單CASE語(yǔ)句

稍加變形的CASE語(yǔ)句

LOOP語(yǔ)句
語(yǔ)法
[LABEL] LOOP
SQL-procedure-statements;
END LOOP [LABEL];
示例
fetch_loop: LOOP
FETCH c1 INTO v_firstname, v_lastname;
SET counter = counter + 1;
IF counter = 51 THEN
LEAVE fetch_loop;
END IF;
END LOOP fetch_loop;
語(yǔ)法
[LABEL] FOR for-loop-name AS [cursor-name CURSOR FOR]
select-statement
DO
SQL-procedure-statements;
END FOR [LABEL];
示例
DECLARE fullname CHAR(40);
FOR v1 AS c1 CURSOR FOR SELECT firstnme, midinit, lastname FROM employee
DO
SET fullname=lastname||‘,’||firstnme||’,’||midinit;
INSERT INTO tname VALUE (fullname);
END FOR;