1. 程式人生 > >PL/SQL包(package)操作例項講解

PL/SQL包(package)操作例項講解

建立包裝規範定義

規範是介面到包。它只是宣告的型別,變數,常量,異常,遊標和子程式可從封裝外部引用。置於規範的所有物件被稱為公共物件。任何子程式在封裝主體中沒有包定義但編碼被稱為私有物件。下面的程式碼片段顯示了具有多個的程式包規範定義。一個包中可以定義的全域性變數和多個程式或函式。

-- Created on 2018/4/2 by E.WANG 
-- 建立包規範定義
create or replace package math_package
as
  --建立兩個整數加法儲存過程
  procedure add(a in int,b in int,c out int);
  --建立兩個是整數的減法函式
  function sub(a in int,b in int ,c out int) return int;
  --建立乘法儲存過程
  procedure mul(a in int,b in out int);
  
  --建立除法函式
  function div(a in int ,b in out number) return number;
end math_package;

執行上述程式碼給出如下截圖:


建立包主體

包體已經在包定義和其他私人宣告中宣告的各種方法,這是從程式碼隱藏在包外的程式碼。CREATE PACKAGE BODY語句用於建立包體。下面的程式碼片段顯示了包體宣告上面建立的math_package包:

-- Created on 2018/4/2 by E.WANG 
--給包math_package建立包體
create or replace package body math_package
as
  --建立兩個整數加法儲存過程
  procedure add(a in int,b in int,c out int)
  is
  begin
    c:=a+b;
    dbms_output.put_line(a || ' + ' || b || ' = ' || c); 
  end add;
  --建立兩個是整數的減法函式
  function sub(a in int,b in int ,c out int) return int 
  is
  begin
    if a>b then
       c:=a-b;
    else
       c:=b-a;
    end if;
    return c;
    exception 
       when VALUE_ERROR then dbms_output.put_line('The value is error!');     
  end sub;
  --建立乘法儲存過程
  procedure mul(a in int,b in out int)
  is
  tmp int;
  begin
   tmp:=b;
   b:=a*b;
   dbms_output.put_line(a || ' * ' || tmp || ' = ' || b); 
  end mul;
  
  --建立除法函式
  function div(a in int ,b in out number) return number
  as
  begin
     if b!=0 then
        b:=a/b;
     else
        raise ZERO_DIVIDE;
     end if;
     return b;
     exception 
       when ZERO_DIVIDE then dbms_output.put_line('ZERO_DIVIDE');    
  end div;
end math_package;

執行上述程式碼截圖:


使用包元素

訪問包元素(變數,過程或函式)的語法如下:

package_name.element_name;

使用上述建立包的操作例項原始碼:

-- Created on 2018/4/2 by E.WANG 
declare 
  --定義幾個變數
  a int;
  b int;
  c int;
  d number;
  tmp number;
begin
  --給a,b賦值
  a:=10;
  b:=20;
  d:=0;
  --呼叫math_package的add儲存過程
  math_package.add(a,b,c);
  --呼叫math_package的mul儲存過程
  math_package.mul(a,b);
  --重新給變數賦值
  a:=10;
  b:=20;
  --呼叫math_package的sub函式
  c:=math_package.sub(a,b,c);
  if a>b then
     dbms_output.put_line(a || ' - ' || b || ' = ' || c); 
  else
     dbms_output.put_line(b || ' - ' || a || ' = ' || c); 
  end if;
  
  --呼叫math_package的div函式
  d:=2;
  tmp:=d;
  d:=math_package.div(a,d);
  dbms_output.put_line(a || ' / ' || tmp || ' = ' || d); 
end;

執行結果截圖如下: