1. 程式人生 > >oracle筆記2-程式包,過程,遊標

oracle筆記2-程式包,過程,遊標

一、程式包

程式包介紹:程式包(PACKAGE,簡稱包)是一組相關過程、函式、變數、常量和遊標等PL/SQL程式設計元素的組合,作為一個完整的單元儲存在資料庫中,用名稱來標識包。它具有面向物件程式設計語言的特點,是對這些PL/SQL 程式設計元素的封裝。包類似於c#和JAVA語言中的類,其中變數相當於類中的成員變數,過程和函式相當於類方法。把相關的模組歸類成為包,可使開發人員利用面向物件的方法進行儲存過程的開發,從而提高系統性能。
一個包由兩個分開的部分組成:
包說明(PACKAGE):包說明部分宣告包內資料型別、變數、常量、遊標、子程式和異常錯誤處理等元素,這些元素為包的公有元素。
包主體(PACKAGE BODY):包主體則是包定義部分的具體實現,它定義了包定義部分所宣告的遊標和子程式,在包主體中還可以宣告包的私有元素。

  create or replace package PKG_DDXX_DATA IS
  procedure P_DDXX_INS(v_sid         in varchar2,
                       v_xmid        in varchar2,
                       v_ddmc        in varchar2,
                       v_i           out number);
  -------------------------------------
  procedure
P_MKGXXX_INS(v_xmid VARCHAR2, v_ddid VARCHAR2, v_creater VARCHAR2, v_valid_flag VARCHAR2, v_i out number);
------------------------------------------ procedure
P_JDGXXX_INS(v_gllx varchar2, v_glid varchar2, v_i out number);
procedure P_MAIN; END; --定義包頭
create or replace package body PKG_DDXX_DATA is
begin
 procedure P_DDXX_INS(v_sid         in varchar2,
                       v_xmid        in varchar2,
                       v_ddmc        in varchar2,
                       v_i           out number) is
         begin
         end;
          procedure P_MKGXXX_INS() is
          begin
          end;
          procedure P_MAIN() is
          begin
          end;
end;--定義包體,包體中有多個子過程。

包體中的主過程中可以呼叫包體中的子過程。
呼叫-call PKG_DDXX_DATA.P_MAIN();

二、過程

儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。

 create or replace procedure P_MKGXXX_INS(
                           v_xmid   VARCHAR2,
                         v_ddid       VARCHAR2,
                         v_creater    VARCHAR2,
                         v_valid_flag VARCHAR2,
                         v_i          out number) is
      --定義一個遊標資料型別
  TYPE ddxx_cursor_type IS REF CURSOR;
    c4             DDXX_CURSOR_TYPE;
    --定義變數
    V_INS_MGMX_SQL VARCHAR2(3000);
    v_mkid         varchar2(200);
    v_ins_mk_num   NUMBER;
  BEGIN
  --給變數賦值
    v_i := 0;
    --插入語句
    V_INS_MGMX_SQL := 'insert into b_scpt_gzl_ddmkgx (   ddid,   mkid,   creater, valid_flag)
                                              values (:v_ddid,:v_mkid,:v_creater,:v_valid_flag)';
--begin end;為一組語句塊
    begin
      open c4 for
        select gg.node_sid
          from b_scpt_gzl_xmxx xm
          left join (select *
                       from b_scpt_gzl_xm_gx
                      where node_type = 'SYSTEM'
                        and VALID_FLAG = '1') gx
            on gx.node_parent_sid = xm.sid
          left join (select *
                       from b_scpt_gzl_xm_gx
                      where node_type = 'MODULE'
                        and VALID_FLAG = '1') gg
            on gg.node_parent_sid = gx.node_sid
         where xm.valid_flag = '1'
           and xm.sid = v_xmid;
      loop
        fetch c4
          into v_mkid;
        EXIT WHEN c4%NOTFOUND;
        if (v_mkid is not null) then
          begin
            execute immediate V_INS_MGMX_SQL
              using v_ddid, v_mkid, v_creater, v_valid_flag;
            v_i := v_i + sql%rowcount; ---插入記錄
            commit;
          end;
        end if;
      end loop;
      close c4;
    end;

  END;

2.1、 P_MKGXXX_INS為定義的過程名,v_xmid VARCHAR2,定義的過程引數和型別,
2.2、 TYPE ddxx_cursor_type IS REF CURSOR;定義了一個遊標型別,在過程中多次使用遊標則 c4 ddxx_cursor_type;
c1 ddxx_cursor_type;
2.3 循環遊標
begin–語句塊開始
open c4 for (所要迴圈的查詢語句);–開啟遊標
loop –開始迴圈
fetch c4
into v_mkid;–將迴圈的值給變更賦值
EXIT WHEN c4%NOTFOUND;
begin
如上的程式碼塊,處理業務
end;
end loop;–結束迴圈
close c4;–關閉遊標
end;–語句塊結束