鍍金池/ 教程/ 數(shù)據(jù)庫/ PL/SQL包
PL/SQL記錄
PL/SQL基本語法
PL/SQL集合
PL/SQL包
PL/SQL關(guān)系運(yùn)算符
PL/SQL比較運(yùn)算符
PL/SQL條件控制
PL/SQL字符串
PL/SQL算術(shù)運(yùn)算符
PL/SQL變量
PL/SQL IF-THEN-ELSIF語句
PL/SQL函數(shù)
PL/SQL異常
PL/SQL FOR循環(huán)語句
PL/SQL日期及時(shí)間
PL/SQL EXIT語句
PL/SQL DBMS輸出
PL/SQL過程
PL/SQL CONTINUE語句
PL/SQL數(shù)組
PL/SQL嵌套IF-THEN-ELSE語句
PL/SQL事務(wù)
PL/SQL CASE語句
PL/SQL IF-THEN語句
PL/SQL GOTO語句
PL/SQL運(yùn)算符優(yōu)先級(jí)
PL/SQL觸發(fā)器
PL/SQL運(yùn)算符
PL/SQL教程
PL/SQL WHILE循環(huán)語句
PL/SQL面向?qū)ο?/span>
PL/SQL循環(huán)
PL/SQL邏輯運(yùn)算符
PL/SQL IF-THEN-ELSE語句
PL/SQL數(shù)據(jù)類型
PL/SQL環(huán)境安裝設(shè)置
PL/SQL游標(biāo)
PL/SQL基本循環(huán)語句
PL/SQL搜索CASE語句
PL/SQL常量和文字
PL/SQL嵌套循環(huán)

PL/SQL包

PL/SQL包是組邏輯相關(guān)的PL/SQL類型,變量和子程序模式對(duì)象。

程序包將有兩個(gè)強(qiáng)制性的部分:

  • 包裝規(guī)范定義

  • 包體或定義

包裝規(guī)范定義

規(guī)范是接口到包。它只是聲明的類型,變量,常量,異常,游標(biāo)和子程序可從封裝外部引用。換句話說,它包含關(guān)于包的內(nèi)容的所有信息,但不包括用于子程序的代碼。

置于規(guī)范的所有對(duì)象被稱為公共對(duì)象。任何子程序在封裝主體中沒有包定義但編碼被稱為私有對(duì)象。

下面的代碼片段顯示了具有單一的程序包規(guī)范定義。一個(gè)包中可以定義的全局變量和多個(gè)程序或函數(shù)。

CREATE PACKAGE cust_sal AS
   PROCEDURE find_sal(c_id customers.id%type);
END cust_sal;
/

當(dāng)上述代碼在SQL提示符執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

Package created.

包主體

包體已經(jīng)在包定義和其他私人聲明中聲明的各種方法,這是從代碼隱藏在包外的代碼。

CREATE PACKAGE BODY語句用于創(chuàng)建包體。下面的代碼片段顯示了包體聲明上面創(chuàng)建的cust_sal包。在前面學(xué)習(xí)中,我們已經(jīng)在數(shù)據(jù)庫中創(chuàng)建了一個(gè)CUSTOMERS表 - PL/SQL變量 這一章節(jié)。

CREATE OR REPLACE PACKAGE BODY cust_sal AS
   PROCEDURE find_sal(c_id customers.id%TYPE) IS
   c_sal customers.salary%TYPE;
   BEGIN
      SELECT salary INTO c_sal
      FROM customers
      WHERE id = c_id;
      dbms_output.put_line('Salary: '|| c_sal);
   END find_sal;
END cust_sal;
/

當(dāng)上述代碼在SQL提示符執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

Package body created.

使用包元素

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

package_name.element_name;

想想,我們已經(jīng)在上面的數(shù)據(jù)庫模式中創(chuàng)建的包,下面的程序是使用cust_sal包的find_sal方法:

DECLARE
   code customers.id%type := &cc_id;
BEGIN
   cust_sal.find_sal(code);
END;
/

當(dāng)上面的代碼在SQL提示符下執(zhí)行,它提示輸入客戶ID,當(dāng)輸入一個(gè)ID,它會(huì)顯示相應(yīng)的薪酬如下:

Enter value for cc_id: 1
Salary: 3000

PL/SQL procedure successfully completed.

例子:

下面的程序提供了一個(gè)更為完整的方案。我們將使用存儲(chǔ)在數(shù)據(jù)庫中的CUSTOMERS表的以下記錄:

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  3000.00 |
|  2 | Khilan   |  25 | Delhi     |  3000.00 |
|  3 | kaushik  |  23 | Kota      |  3000.00 |
|  4 | Chaitali |  25 | Mumbai    |  7500.00 |
|  5 | Hardik   |  27 | Bhopal    |  9500.00 |
|  6 | Komal    |  22 | MP        |  5500.00 |
+----+----------+-----+-----------+----------+

包規(guī)范定義:

CREATE OR REPLACE PACKAGE c_package AS
   -- Adds a customer
   PROCEDURE addCustomer(c_id   customers.id%type,
   c_name  customers.name%type,
   c_age  customers.age%type,
   c_addr customers.address%type, 
   c_sal  customers.salary%type);
  
   -- Removes a customer
   PROCEDURE delCustomer(c_id  customers.id%TYPE);
   --Lists all customers
   PROCEDURE listCustomer;
 
END c_package;
/

當(dāng)上面的代碼在SQL提示符下執(zhí)行,它會(huì)創(chuàng)建上述包,并顯示以下結(jié)果:

Package created.

創(chuàng)建包的主體部分:

CREATE OR REPLACE PACKAGE BODY c_package AS
   PROCEDURE addCustomer(c_id  customers.id%type,
      c_name customers.name%type,
      c_age  customers.age%type,
      c_addr  customers.address%type, 
      c_sal   customers.salary%type)
   IS
   BEGIN
      INSERT INTO customers (id,name,age,address,salary)
         VALUES(c_id, c_name, c_age, c_addr, c_sal);
   END addCustomer;
  
   上一篇:PL/SQL條件控制下一篇:PL/SQL比較運(yùn)算符