パッケージ(Packageと略称)は、関連するサブプログラムの集合であり、サブプログラムで使用されるカーソルや変数を含めてデータベースに格納され、単一のユニットとして利用されます。
OceanBasesデータベースは多くのシステムパッケージを提供しており、これらのパッケージはデータベースの機能を拡張します。アプリケーションを作成する際にシステムパッケージを利用できます。例えば、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