プログラムパッケージ(Package、略称:パッケージ)とは、関連するサブルーチンの集合であり、サブルーチンで使用されるカーソルや変数を含み、データベース内に一つの単位として格納され、まとめて利用されます。
OceanBaseデータベースは多くのシステムパッケージを提供しており、これらのパッケージはデータベース機能を拡張します。アプリケーションを作成する際にこれらのシステムパッケージを使用できます。例えば、DBMS_RANDOMパッケージを使用すると、簡単にランダム値を取得できます。
パッケージの利点
PLパッケージは、アプリケーション開発に多くの便利さと利点をもたらします。その利点は以下の通りです:
機能のカプセル化
パッケージはオブジェクト指向プログラミング言語の特徴を備えており、ストアドプロシージャ、変数、カスタムデータ型などを一つのパッケージ内にカプセル化できます。これにより、これらのより小さな単位を組織し管理することが容易になります。パッケージはC++やJava言語のクラスに似ており、変数はクラス内のメンバ変数に相当し、ストアドプロシージャや関数はクラスメソッドに相当します。パッケージのカプセル化は権限管理も簡素化し、パッケージへのアクセス権限を付与されれば、その権限を持つ者はパッケージ内の各構造にアクセスできます。
高いデータセキュリティ
パッケージ内で定義された変数、カーソル、ストアドプロシージャは、公開または非公開に設定できます。「公開」はパッケージのユーザーが直接アクセスできることを、「非公開」はパッケージのユーザーが直接アクセスできないことを意味します。
例えば、あるパッケージに3つの変数と5つのストアドプロシージャがある場合、そのうち2つの変数と3つのストアドプロシージャを非公開に設定すれば、これら2つの変数と3つのストアドプロシージャはパッケージ内部からしかアクセスできず、パッケージの使用者は残りの1つの変数と2つのストアドプロシージャのみにアクセスできます。
パッケージの作成
パッケージを作成するには、パッケージヘッダとパッケージボディの2つの部分が必要です。パッケージヘッダではすべての公開構造を宣言し、パッケージボディでは公開部分と非公開部分を含むパッケージのすべての構造を定義します。
以下の例では、students テーブルと students_adm のパッケージを作成しています。パッケージ内には2つのストアドプロシージャがあり、学生が入学する際には students_adm.stu_entrance を呼び出して students テーブルに学生情報を挿入し、学生が卒業する際には students_adm.graduate を呼び出して students テーブルから学生情報を削除します。
obclient> CREATE TABLE students (id INT, name VARCHAR2(100), class INT, grade INT, dorm VARCHAR2(100), year INT);
obclient> CREATE OR REPLACE PACKAGE students_adm AS
PROCEDURE stu_entrance(id INT, name VARCHAR2, class INT, grade INT, dorm VARCHAR2, year INT);
PROCEDURE graduate(id INT);
END students_adm;
/
obclient> CREATE OR REPLACE PACKAGE BODY students_adm AS
PROCEDURE stu_entrance(id INT, name VARCHAR2, class INT, grade INT, dorm VARCHAR2, year INT) AS
BEGIN
INSERT INTO students VALUES (id, name, class, grade, dorm, year);
END;
PROCEDURE graduate(id INT) AS
BEGIN
DELETE from students s WHERE s.id = id;
END;
END students_adm;
/
obclient> CALL students_adm.stu_entrance(1001, 'Curry', 5, 10, '1-1-3', 12);
Query OK, 0 rows affected
obclient> SELECT * from students WHERE id = 1001;
+------+-------+-------+-------+-------+------+
| ID | NAME | CLASS | GRADE | DORM | YEAR |
+------+-------+-------+-------+-------+------+
| 1001 | Curry | 5 | 10 | 1-1-3 | 12 |
+------+-------+-------+-------+-------+------+
1 row in set
obclient> CALL students_adm.graduate(1001);
Query OK, 0 rows affected
obclient> SELECT * from students WHERE id = 1001;
Empty set