qileilove

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

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

          REPEAT語句
          ftch_loop2:
          REPEAT
              FETCH  c1  INTO  v_firstname,  v_midinit,  v_lastname;
          UNTIL  SQLCODE  <>  0  AND  REPEAT  ftch_loop2;
          WHILE語句
          WHILE  at_end  =  0  DO
              FETCH  c1  INTO  v_firstname,  v_midinit,  v_lastname;
              IF  SQLCODE  =  100  THEN
                  SET  at_end  =  1;
              END  IF;
          END  WHILE;
          LEAVE和ITERATE語句
          LEAVE和ITERATE語句來控制循環
          LEAVE語句用來跳出循環
          ITERATE語句用來回到for或者while循環的開始重新執行
          示例
          FETCH_LOOP1:  LOOP
              FETCH  c1  INTO  v_dept,  v_deptname,  v_admdept;
              IF  at_end  =  1  THEN  
                  LEAVE FETCH_LOOP1;
              ELSEIF  v_dept  =  ‘D01’  THEN
                  ITERATE FETCH_LOOP1;
              END  IF;
              INSERT  INTO  department(deptno, deptname, admdept)
             VALUES(‘NEW’, v_deptname, v_admdept);
          END  LOOP FETCH_LOOP1;
          GOTO語句
          GOTO語句用于直接跳轉到指定標簽處。例如:
          IF  v_DEPT  =  ‘D11’
              GOTO  bye;
          ……
          bye:
          RETURN語句
          RETURN語句用于向調用返回。
          IF  v_DEPT  =  ‘D11’
              RETURN  1;
          八 游標和結果集

          游標的聲明
          下面是游標聲明的幾個例子:
          DECLARE  c1  CURSOR  FOR select * from staff;
          (DECLARE關鍵字,cl游標名稱, CURSOR是必須有的,;指通過c1的游標來操作staff里所有的數據)最常用的最普通的。
          2.DECLARE  c1  CURSOR  WITH  HOLD FOR  select  *   form  staff;
          3.DECLARE  c1  CURSOR WITH  RETURN  TO  CALLER  FOR  select  *   form  staff;
          4.DECLARE  c1  CURSOR WITH  RETURN  TO  CLIENT  FOR  select  *   form  staff;

          游標的相關操作
          打開游標
          OPEN  <游標名>
          提取游標
          FETCH  <游標名>  INTO  <變量列表>
          關閉游標
          CLOSE  <游標名>
          游標的遍歷

          DECLARE  at_end  INT  DEFAULT  0; (聲明了at_end的變量,默認值是0)
          DECLARE  PIID  INTEGER  DEFAULT  0;
          DECLARE  PINT  INTEGER  DEFAULT  0;
          DECLARE  not_found  CONDITION FOR SQLSTATE '02000';   
          DECLARE  c1  CURSOR  FOR  SELECT  IID  FROM  YH; (聲明了一個游標,把IID的指標拿出來)
          DECLARE  CONTINUE  HANDLER  FOR  not_found  SET  at_end  =  1;   
          OPEN c1; (進行循環)
          SET  PCOUNT  =  0;   
          ins_loop:   LOOP
              FETCH  c1  INTO  PIID;   
              IF  at_end  <>  0  THEN   
                  LEAVE  ins_loop;    ( LEAVE跳出循環)
              END  IF;
              SET  PCOUNT  =  PCOUNT  +  1; (表示提取了多少條記錄)
          END LOOP;
          刪除游標對應的數據行
          DECLARE  cursor1  CURSOR  FOR   SELECT  DEPTNO,  DEPTNAME,  LOCATION
          FROM  DB2ADMIN.ORG  FOR  UPDATE;(聲明一個cursor1的游標,從一個表時提出部門名稱,...,位置)
          OPEN  cursor1;(打開游標)
          FETCH  FROM  cursor1  INTO  v_DEPTNO,  V_DEPTNAME,  v_LOCATION;
          DELETE  FROM  DB2ADMIN.ORG  WHERE CURRENT  OF  cursor1;(刪除DB2ADMIN.ORG的記錄; CURRENT  OF  cursor1這是的游標是指向某一個位置;刪除游標指向的當前行。)
          CLOSE  cursor1;(關閉游標,也可做一個循環,刪除所有的內容)
          更新游標對應的數據行
          DECLARE  cursor1  CURSOR  FOR   SELECT  DEPTNO,  DEPTNAME,  LOCATION
          FROM  DB2ADMIN.ORG FOR  UPDATE;
          OPEN  cursor1;
          FETCH  FROM  cursor1  INTO  v_DEPTNO,  v_DEPTNAME,  v_LOCATION;
          UPDATE  DB2ADMIN.ORG  SET   DEPTNAME  =  ‘NEW NAME’WHERE CURRENT  OF  cursor1;
          CLOSE  cursor1;
          使用游標返回多個結果集



          九 異常處理器

          異常處理器的聲明

          DECLARE handler-type HANDLER FOR condition handler-action; 
          (語法結構)(異常處理器是需要預先聲明的)
          異常處理器的類型(handler-type)
          異常處理器的類型有如下幾種:
          CONTINUE(繼續)
          在異常處理器操作完成之后,會繼續執行產生這個異常語句之后的下一條語句。 
          EXIT(記錄完后就退出,不再繼續執行)
          在異常處理器操作完成之后,存儲過程會終止,并將控制返回給調用者。 
          UNDO(撤銷所做的記錄,退出整個程序)
          在異常處理器操作執行之前,DB2會回滾存儲過程中執行的SQL操作。在異常處理器操作完成之后,存儲過程會終止,并將控制返回給調用者。 
          異常處理器和SQLSTATE
          異常處理器可以處理基于特定SQLSTATE值的定制異常,或者處理預定義異常的類。預定義的3種異常如下所示: 
          NOT FOUND
          標識導致SQLCODE值為+100或者SQLSATE值為02000的異常。這個異常通常在SELECT沒有返回行的時候出現。 
          SQLEXCEPTION
          標識導致SQLCODE值為負的異常。 
          SQLWARNING
          標識導致警告異常或者導致+100以外的SQLCODE正值的異常。 
          注:如果產生了NOT FOUND 或者SQLWARNING異常,并且沒有為這個異常定義異常處理器,那么就會忽略這個異常,并且將控制流轉向下一個語句。如果產生了SQLEXCEPTION異常,并且沒有為這個異常定義異常處理器,那么存儲過程就會失敗,并且會將控制流返回調用者
          異常處理器示例
          如下示例聲明了兩個異常處理器。 EXIT處理器會在出現SQLEXCEPTION 或者SQLWARNING異常的時候被調用。EXIT處理器會在終止SQL程序之前,將名為stmt的變量設為“ABORTED”,并且將控制流返回給調用者。UNDO處理器會將控制流返回給調用者之前,回滾存儲過程體中已經完成的SQL操作。 
             DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING 
                         SET stmt = 'ABORTED'; 
              DECLARE UNDO HANDLER FOR NOT FOUND; 
          異常處理器定制
           如果預定義異常集不能滿足需求,就可以為特定的SQLSTATE值聲明定制異常,然后再為這個定制異常聲明處理器。語法如下: 
             DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate' 
          更為復雜的異常處理器示例(1 of 2)
              -- Generic Handler 
              DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
              BEGIN NOT ATOMIC
                  -- Capture SQLCODE & SQLSTATE 
                  SELECT SQLCODE, SQLSTATE 
                      INTO hSqlcode, hSqlstate 
                      FROM SYSIBM.SYSDUMMY1; 
                      
                      -- Use the poGenStatus variable to tell the procedure -- what type of error occurred
                      CASE hSqlstate 
                      WHEN '02000' THEN 
                            SET poGenStatus=5000; 
                      WHEN '42724' THEN 
                           SET poGenStatus=3; 
                      ELSE IF (hSqlCode < 0) THEN 
                        SET poGenStatus=hSqlCode; 
                      END IF; 
               END 
            上面的異常處理器會在出現SQLEXCEPTION, SQLWARNING, NOT FOUND異常的時候觸發。異常處理器會取出當前的SQLCODE, SQLSTATE,然后根據它們的值來設置輸出參數(poGenStatus)的值。 

          十 編寫和調試存儲過程
          創建存儲過程
          將存儲過程部署到本地或遠程DB2數據庫
          修改并重新部署存儲過程
          對存儲過程進行測試和Debug
          使用Command Editor創建存儲過程(1 of 3)





          posted on 2012-12-11 16:34 順其自然EVO 閱讀(2587) 評論(0)  編輯  收藏 所屬分類: DB2

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 漯河市| 游戏| 乌兰察布市| 达尔| 汉源县| 塔河县| 阜平县| 于都县| 眉山市| 寻甸| 前郭尔| 嘉定区| 宣城市| 丁青县| 乐都县| 沧州市| 桦川县| 金寨县| 青岛市| 孝义市| 乌兰察布市| 财经| 普安县| 上高县| 承德市| 水城县| 蓬莱市| 海城市| 湟源县| 明光市| 平山县| 洪江市| 麦盖提县| 凤冈县| 平凉市| 安达市| 东平县| 蒙山县| 镇沅| 临城县| 连城县|