Plsql-packages

提供:Dev Guides
移動先:案内検索

PL/SQL-パッケージ

この章では、PL/SQLのパッケージについて説明します。 パッケージは、論理的に関連するPL/SQLタイプ、変数、およびサブプログラムをグループ化するスキーマオブジェクトです。

パッケージには2つの必須部分があります-

  • パッケージ仕様
  • パッケージ本体または定義

パッケージ仕様

仕様はパッケージへのインターフェースです。 パッケージの外部から参照できる型、変数、定数、例外、カーソル、およびサブプログラムを DECLARES します。 つまり、パッケージのコンテンツに関するすべての情報が含まれていますが、サブプログラムのコードは除外されています。

仕様に含まれるすべてのオブジェクトは、 public オブジェクトと呼ばれます。 パッケージ仕様にはないが、パッケージ本体にコード化されたサブプログラムは、 private オブジェクトと呼ばれます。

次のコードスニペットは、1つのプロシージャを持つパッケージ仕様を示しています。 多くのグローバル変数を定義し、パッケージ内で複数のプロシージャまたは関数を使用できます。

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

上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-

Package created.

パッケージ本体

パッケージ本体には、パッケージ仕様で宣言されたさまざまなメソッドのコードと、パッケージ外部のコードから隠されている他のプライベート宣言があります。

*CREATE PACKAGE BODY* ステートメントは、パッケージ本体の作成に使用されます。 次のコードスニペットは、上記で作成された *_cust_sal_* パッケージのパッケージ本体宣言を示しています。 link:/plsql/plsql_variable_types [PL/SQL-変数]の章で述べたように、データベースにCUSTOMERSテーブルがすでに作成されていると想定しました。
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;
/

上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-

Package body created.

パッケージ要素の使用

パッケージ要素(変数、プロシージャまたは関数)は、次の構文でアクセスされます-

package_name.element_name;

データベーススキーマで上記のパッケージを既に作成していることを考慮してください。次のプログラムは cust_sal パッケージの find_sal メソッドを使用します-

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

上記のコードがSQLプロンプトで実行されると、顧客IDの入力を求められ、IDを入力すると、対応する給与が次のように表示されます-

Enter value for cc_id: 1
Salary: 3000

PL/SQL procedure successfully completed.

次のプログラムは、より完全なパッケージを提供します。 私たちは、データベースに保存された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 |
+----+----------+-----+-----------+----------+

パッケージ仕様

CREATE OR REPLACE PACKAGE c_package AS
   -- Adds a customer
   PROCEDURE addCustomer(c_id   customers.id%type,
   c_name  customerS.No.ame%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;
/

上記のコードがSQLプロンプトで実行されると、上記のパッケージが作成され、次の結果が表示されます-

Package created.

パッケージ本体の作成

CREATE OR REPLACE PACKAGE BODY c_package AS
   PROCEDURE addCustomer(c_id  customers.id%type,
      c_name customerS.No.ame%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;

   PROCEDURE delCustomer(c_id   customers.id%type) IS
   BEGIN
      DELETE FROM customers
      WHERE id = c_id;
   END delCustomer;

   PROCEDURE listCustomer IS
   CURSOR c_customers is
      SELECT  name FROM customers;
   TYPE c_list is TABLE OF customers.Name%type;
   name_list c_list := c_list();
   counter integer :=0;
   BEGIN
      FOR n IN c_customers LOOP
      counter := counter +1;
      name_list.extend;
      name_list(counter) := n.name;
      dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
      END LOOP;
   END listCustomer;

END c_package;
/

上記の例では、*ネストされたテーブル*を使用しています。 ネストした表の概念については、次の章で説明します。

上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-

Package body created.

パッケージの使用

次のプログラムは、パッケージ_c_package_で宣言および定義されたメソッドを使用します。

DECLARE
   code customers.id%type:= 8;
BEGIN
   c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500);
   c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500);
   c_package.listcustomer;
   c_package.delcustomer(code);
   c_package.listcustomer;
END;
/

上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-

Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
Customer(8): Subham
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish

PL/SQL procedure successfully completed