qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          跟屌絲一起學(xué)習(xí) DB2 第五課 存儲(chǔ)過(guò)程(一)

          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ù)類型


          字符型: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ǔ)句




          說(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;

          七、控制語(yǔ)句
          IF語(yǔ)句
          格式:
          IF  條件1   THEN  statement1;
          ELSEIF  條件2  THEN  statement2;
          ELSE  statement3;
            END  IF;
          注:條件成立時(shí)為TRUE (真),不成立時(shí)為FALSE(假) 和 NULL
          IF語(yǔ)句例子
          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;
          FOR語(yǔ)句
          語(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;

          posted on 2012-12-11 15:56 順其自然EVO 閱讀(2039) 評(píng)論(1)  編輯  收藏 所屬分類: DB2

          評(píng)論

          # re: 跟屌絲一起學(xué)習(xí) DB2 第五課 存儲(chǔ)過(guò)程(一) 2013-04-26 15:40 sd

          屌絲我終于找到你了
            回復(fù)  更多評(píng)論   

          <2012年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 绍兴县| 梅河口市| 察隅县| 荆门市| 清丰县| 太保市| 砀山县| 荥经县| 大庆市| 湘乡市| 剑河县| 佛冈县| 衡阳县| 易门县| 茂名市| 芜湖市| 绥芬河市| 墨江| 陵水| 三台县| 长兴县| 吉木乃县| 石嘴山市| 江陵县| 玉屏| 得荣县| 达拉特旗| 曲麻莱县| 洛宁县| 泾阳县| 灌南县| 溆浦县| 阳城县| 疏勒县| 依兰县| 东丰县| 马鞍山市| 上栗县| 蚌埠市| 开封县| 兰溪市|