PLはSQLのデータ処理能力と手続き型言語の処理能力を組み合わせ、新しいAPIを学習することなくSQL文を直接処理できるようにします。
他の手続き型プログラミング言語と同様に、PLは定数と変数の宣言、プログラムフローの制御、サブルーチンの定義、および実行時エラーの捕捉をサポートします。
例外処理
PLはエラーの検出と処理を容易にします。
エラー発生時、PLは例外を報告し、データベースの現在実行中のタスクを停止し、対応するPLブロックで例外処理を行います。そのため、PLを使用する場合は、Cプログラムのように各操作ごとにトラブルシューティングを行う必要はありません。
PLブロック
PLソースプログラムの基本単位はブロックであり、宣言と文で構成されます。
PLブロックはキーワード DECLARE、BEGIN、EXCEPTION、END で定義されます。これらのキーワードはそれぞれ、ブロックを宣言部、実行部、例外処理部に分けますが、実行部のみが必須です。
PLブロックの宣言はローカル属性であり、ブロックの実行終了後は存在しなくなります。これにより、変数やサブプログラムの名前空間の混乱を避けることができます。
ブロックは他のブロックにネストできます。ブロックは実行可能な文であるため、他のブロックの実行可能な文中に記述することができます。各PLブロックにはラベルを設定できます。
PLブロックには匿名ブロックも含まれます。匿名ブロックは対話型ツール(例えばOBClient)に送信したり、プログラムに読み込んだりできます。このブロックは対話型ツールやプログラム内で一度だけ実行され、データベースには保存されません。
変数と定数
PLは変数と定数の宣言をサポートしており、式の中で使用できます。
プログラムの実行時には変数の値を変更できますが、定数の値は変更できません。
パッケージ
パッケージは、論理的に関連するPL型、変数、定数、サブプログラム、カーソル、例外で構成されます。
パッケージはコンパイルされてデータベースに格納されるため、パッケージを一種のアプリケーションと見なすことができます。
独自のパッケージを作成することも、OceanBaseデータベースが提供するシステムパッケージを使用することもできます。
トリガー
トリガーは名前付けられたPLユニットであり、データベースに格納され、データベース内で発生するイベント、すなわちトリガーイベントに応答して実行されます。
トリガーが特定のイベントの前または後に実行されるかどうか、およびトリガーが各イベントごとに実行されるか、そのイベントの各行ごとに実行されるかどうかを指定できます。例えば、t1 テーブルで INSERT ステートメントが実行されるたびに実行されるトリガーを作成できます。
入出力
ほとんどのPL入出力(I/O)は、テーブルにデータを格納したり、テーブルをクエリするSQLステートメントを使用して完了します。残りのPL I/Oはすべて、OceanBaseデータベースが提供するPLシステムパッケージによって実行されます。
現在のバージョンでサポートされているPL I/O処理システムパッケージは DBMS_OUTPUT のみです。そのため、OBClientを使用して DBMS_OUTPUT の出力情報を表示する必要があり、まず SET SERVEROUTPUT ON コマンドを実行する必要があります。
データの抽象化
OceanBaseデータベースは、カーソルや複合変数などのデータ抽象化機能をサポートしており、データの詳細を深く研究することなく、基本的な属性を処理するために利用できます。
カーソル
OceanBaseデータベースがSQLステートメントを実行すると、結果セットと処理情報を未命名のプライベートメモリ領域に保存し、そのメモリ領域の開始位置を指すポインタを設定します。このポインタが カーソル です。カーソルを使用すると、毎回1行のレコードを取得できます。カーソル属性はカーソルの状態情報を返します。
複合変数
PLには2種類の複合変数、すなわち集合とレコードが含まれます。複合変数全体をパラメータとしてサブプログラムに渡すことができます。
集合の内部コンポーネントは常に同じデータ型であり、要素と呼ばれます。各要素は一意のインデックスでアクセスできます。集合には一般的にリストと配列が含まれます。
レコードの内部コンポーネントは異なるデータ型を持つことができ、フィールドと呼ばれます。各フィールドには名前でアクセスできます。レコード変数はテーブルの行、またはテーブルの行の特定の列を保持することができます。
%ROWTYPE属性の使用
%ROWTYPE 属性は、データベースのテーブルまたはビューの完全または部分的な行を表すレコード型を宣言するために使用できます。
完全または部分的な行の各列に対して、レコードには同名のデータ型を持つフィールドがあります。レコードの構造は行の構造の変化に応じて変化します。
%TYPE属性の使用
%TYPE 属性は、以前に宣言された変数や列と同じデータ型を持つデータ項目を宣言するために使用できます(そのデータ型が何であるかを知る必要はありません)。
参照される項目の宣言が変更された場合、その参照項目の宣言も適宜変更されます。%TYPE 属性は、データベースの値を保持するための変数を宣言するために使用できます。
抽象データ型
抽象データ型(ADT)は、データ構造とサブプログラムで構成されます。ADTはデータベースに格納されます。ADTのインスタンスはテーブルに格納され、PL変数として使用できます。
データ構造を形成する変数は属性(Attributes)と呼ばれます。属性を操作するサブプログラムはメソッド(Methods)と呼ばれます。
ディクショナリビュー * _OBJECTS では、ADTの OBJECT_TYPE は TYPE です。ディクショナリビュー * _TYPES では、ADTの TYPECODE は OBJECT です。
制御文
PL制御文は、SQL文にとって最も重要な拡張機能です。
PLには以下の3種類の制御文が含まれます:
条件制御文:異なる条件下のデータ値に対して異なる文を実行します。
ループ制御文:異なるデータ値を使用して、同じ文を繰り返し実行します。
手続き制御文:指定されたラベルに対応する文にジャンプすることも、何も操作を行わないこともできます。
1回の処理で複数行のクエリ結果を処理する
PLはSQLクエリを送信し、一度に複数行の結果を処理できます。
基本的なループ制御文を使用するか、単一の文だけでクエリの実行、結果の取得、処理をすべて完了できます。