Plsql-packages
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