qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          跟屌絲一起學習 DB2 第五課 存儲過程(一)

          DB2 存儲過程

          一、什么是存儲過程

          受 DB2 服務器控制的一段可執行程序

          可以通過SQL的CALL語句來完成對存儲過程的調用

          在存儲過程中可以包含業務邏輯

          存儲過程可以在本地或遠程進行調用

          存儲過程可以接收或傳遞參數,生成結果集

          二、存儲過程特征

          包含使用sql語句的過程構造

          存儲在數據庫中且在db2 服務器上運行;

          可以由正在使用的sql的應用程序根據名稱來調用;

          允許應用程序分2部分允許,在客戶機上運行應用程序,在服務器上運行存儲過程

          存儲過程在應用程序中的優勢

          減少了客戶機與服務器直接的網絡使用率

          增強了硬件和軟件功能

          提高了安全性

          減少了開發成本并且提高了可靠性

          集中處理了公共例程的安全性、管理和維護

          通過sql pl 當前的語句集合和語言特性,可以用sql開發綜合的、高級的程序

          例如函數、存儲過程和觸發器。這樣便可以將業務邏輯封裝到易于維護的數據庫對象中,從而提高數據庫應用程序的性能。

          SQL PL 支持本地和全局變量,包括聲明和賦值,還支持條件語句和迭代語句、控制語句的轉移、錯誤管理語句以及返回結果集的方法。

          三、什么時候使用存儲過程

          使用存儲過程的合適時機:

          應用程序的性能無法滿足預期時

          客戶端數量較多且應用程序中SQL代碼分散時

          應用程序需要進行繁重的數據庫操作,同時這些操作并不需要進行太多的客戶交互

          應用程序代碼更改頻繁

          需要對客戶應用代碼進行訪問控制時

          客戶應用需要在一次操作中執行多條 SQL 語句



          五、數據類型


          字符型:char varchar

          日期型 date

          數字型 number decilmal integer

          詳細請看屌絲大哥 db2數據類型介紹的那一課

          六、Db2 存儲過程基本語法

          6.1 存儲過程結構

          CREATE OR REPLACE PROCEDURE <過程名>

          ( [ IN | OUT | INOUT ]  參數名  數據類型  默認值 )

          LANGUAGE  SQL

          BEGIN

                業務邏輯代碼

          END;

          IN(輸入參數)

          只是將實參傳遞給存儲過程,但在存儲過程中不能對其進行修改。換句話說,對于存儲過程而言它是只讀的。

          OUT(輸出參數)

          在存儲過程結束時向調用者返回。一般在過程中都會被賦值。

          INOUT(輸入輸出參數)

          上述兩種參數類型的結合體。它可以幫助調用者將實參傳遞給進程,另外它也能夠作為輸出參數被修改和賦值。

          復合語句實例

          復合語句是指包含在BEGIN和END間的語句。它一般包括如下語句類型:

          聲明語句

          賦值語句

          控制語句

          條件處理語句




          說明:

          1. 復合語句可以嵌套使用。

          2. BEGIN語句可以和標簽組合使用,這樣可以更清晰的標識語句塊的范圍。

          6.2 變量聲明與變量賦值

          變量聲明語法:

          DECLARE 變量名  數據類型 初始值;

          Delcare DiaoSiName varchar(20);

          變量賦值語法 :set 變量名=值;

          例如:給屌絲姓名變量賦值。

          Set DiaoSiName = 奶娃;

          變量聲明

          DECLARE  my_var  INTEGER  DEFAULT  6;

          條件聲明

          DECLARE  not_found  CONDITION  FOR  SQLSTATE  ‘02000’;

          游標聲明

          DECLARE  c1  CURSOR  FOR  select  *  from  staff;

          異常處理器聲明

          DECLARE  EXIT  HANDLER  FOR  SQLEXCEPTION  …;

          語法

          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 語句返回記錄超過一行,示例 3 將會返回SQLERROR。






          模塊 - 規格說明(Module Specification)

          模塊可以發布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);
          模塊 - 實現(Module Implementation)
          下面的代碼是模塊的實現部分:
          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

          模塊 - 其他語句

          刪除整個模塊
          DROP  MODULE  myMod;
          保留規格說明內容,刪除實現
          ALTER  MODULE  myMod  DROP  BODY;
          刪除模塊中的存儲過程(SP)
          ALTER MODULE myMod DROP PROCEDURE myProc;
          將模塊的執行權限賦給joe
          GRANT EXECUTE ON MODULE myMod TO joe;

          七、控制語句
          IF語句
          格式:
          IF  條件1   THEN  statement1;
          ELSEIF  條件2  THEN  statement2;
          ELSE  statement3;
            END  IF;
          注:條件成立時為TRUE (真),不成立時為FALSE(假) 和 NULL
          IF語句例子
          IF  rating  =  1  THEN
          UPDATE  EMPLOYEE  SET  salary  =  salary*1.10
               WHERE  empno  =  i_num;(如果滿足于...時,薪水調整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語句(1 of 2)

          簡單CASE語句



          稍加變形的CASE語句




          LOOP語句
          語法
          [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語句
          語法
          [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) 評論(1)  編輯  收藏 所屬分類: DB2

          評論

          # re: 跟屌絲一起學習 DB2 第五課 存儲過程(一) 2013-04-26 15:40 sd

          屌絲我終于找到你了
            回復  更多評論   

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南安市| 牡丹江市| 肃宁县| 瑞金市| 东丽区| 慈利县| 巴马| 牙克石市| 全南县| 奉新县| 麻城市| 清丰县| 高密市| 会昌县| 松江区| 平阳县| 都安| 荣昌县| 威信县| 左贡县| 黑龙江省| 巴彦淖尔市| 定陶县| 紫云| 大邑县| 即墨市| 平利县| 达拉特旗| 从江县| 昔阳县| 双峰县| 申扎县| 万荣县| 梅河口市| 彭州市| 九寨沟县| 马公市| 时尚| 乌拉特后旗| 民县| 宜宾市|