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;–語句塊結束