1. 程式人生 > >Oracle儲存過程中包的使用舉例

Oracle儲存過程中包的使用舉例

一、建立測試表

--建立測試表
create table pes(ID number(10),NAME varchar2(20),pwd varchar2(20),TYPE VARCHAR(20));
 
insert into pes values(1,'xzw','888','Y');
insert into pes values(1,'Eric','888','Y');
insert into pes values(1,'lzq','555','Y');
insert into pes values(1,'aaa','111','N');
insert into pes values(1,'bbb','222','N');
 
select * from pes;

測試表中的資料如下圖所示:

二、建立臨時表

--建立事務級別的person_tmp臨時表
CREATE GLOBAL TEMPORARY TABLE person_tmp(
 ID NUMBER,
 NAME VARCHAR2(100),
 pwd VARCHAR2(100)
)ON COMMIT DELETE ROWS;

--建立會話級別的person臨時表
CREATE GLOBAL TEMPORARY TABLE person(
 ID NUMBER,
 NAME VARCHAR2(100),
 pwd VARCHAR2(100)
)ON COMMIT PRESERVE ROWS;

       臨時表有事務級別的臨時表和會話級別的臨時表。事務級別的臨時表使用ON COMMIT DELETE ROWS進行建立,而會話級別的臨時表使用ON COMMIT PRESERVE ROWS進行建立。事務級別的臨時表只對當前事務有效,而會話級別的臨時表只對當前會話有效。

三、建包並建立包體

--建包並建立包體
CREATE OR REPLACE PACKAGE person_package --建包
AS
  PROCEDURE person_select(
     TYPE VARCHAR2 --型別
  );
END person_package;

CREATE OR REPLACE PACKAGE BODY person_package --建立包體
AS
 PROCEDURE person_select(
   TYPE VARCHAR2
 )
 AS
   exe_sql_1 varchar2(4000);
   exe_sql_2 varchar2(4000);
 BEGIN
   exe_sql_1:='insert into person_tmp(ID,NAME,pwd) '||
            'select id,name,pwd from ( '||
            'pes where type = '''||type||''' ';
   
   exe_sql_2:='insert into person(ID,NAME,pwd) '||
            'select * from person_tmp ';
      
   execute immediate exe_sql_1;
   execute immediate exe_sql_2;

   exception
     when others then
       dbms_output.put_line(sqlerrm);
       
 end person_select;

end person_package;

       新建的包和包體分別在plsql左側欄的Packages和Packages bodies中顯示,如果包或包體在建立過程中出錯的話,左側欄會顯示紅色的叉號。

這裡我們的包以及包體均沒有問題。

四、測試

--測試
declare 
   TYPE VARCHAR2(20);
 begin 
   TYPE := 'Y';
   person_package.person_select(TYPE);
 end;

測試結果:

此時,如果點選提交按鈕或者執行commit命令,我們得到如下的結果:

這就是上面所說的事務級別的臨時表只對當前事務有效而會話級別的臨時表只對當前會話有效。