PLはSQLのデータ処理能力と手続き言語の処理能力を組み合わせ、新しいAPIを習得することなくSQL文を直接処理できるようにします。
他の手続き型プログラミング言語と同様に、PLは定数と変数の宣言、プログラムフローの制御、サブルーチンの定義、実行時エラーの捕捉をサポートします。
例外処理
PLはエラーの検出と処理を容易に行えます。
エラー発生時、PLは例外を報告し、データベースの現在実行中のタスクは停止され、対応するPLブロックで例外処理が行われます。そのため、PLを使用する際にはCプログラムのように各操作ごとにトラブルシューティングを行う必要はありません。
PLブロック
PLソースプログラムの基本単位はブロックであり、宣言と文で構成されます。
PLブロックはキーワード DECLARE、BEGIN、EXCEPTION、END で定義されます。これらのキーワードはそれぞれブロックを宣言部、実行可能部、例外処理部に分け、実行可能部のみが必須です。
PLブロックの宣言はローカル属性であり、ブロックの実行終了後には存在しなくなります。これにより、変数やサブルーチンの名前空間の混乱を避けることができます。
ブロックは他のブロックにネストできます。ブロックは実行可能な文であるため、他のブロックの実行可能な文中に記述することができます。各PLブロックにはラベルを設定できます。
PLブロックには匿名ブロックも含まれます。匿名ブロックは対話型ツール(例:OBClient)に送信するか、プログラムに読み込むことができます。このブロックは対話型ツールやプログラム内で1回だけ実行され、データベースには保存されません。
変数と定数
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種類の複合変数、すなわち集合とレコードがあります。複合変数全体をパラメータとしてサブプログラムに渡すことができます。
集合の内部コンポーネントは常に同じデータ型であり、要素と呼ばれます。各要素は一意のインデックスでアクセスできます。集合には通常、リストと配列が含まれます。
レコードの内部コンポーネントは異なるデータ型を持つことができ、フィールドと呼ばれます。各フィールドには名前でアクセスできます。レコード変数は、テーブルの1行、またはその行の特定の列を保持できます。
%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クエリを送信し、複数行の結果を一度に処理できます。
基本的なループ制御文を使用するか、単一の文だけでクエリの実行、結果の取得、処理を完了できます。