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種類の制御文が含まれます:
条件制御文:異なる条件下のデータ値に対して異なる文を実行します。
ループ制御文:異なるデータ値を使用して、同一の文を繰り返し実行します。
順序制御文:指定されたラベルに対応する文にジャンプすることも、何も実行しないこともできます。
一度に複数行のクエリ結果を処理する
PLはSQLクエリを送信し、一度に複数行の結果を処理できます。
基本的なループ制御文を使用するか、単一のステートメントだけを使用してクエリの実行、結果の取得、および処理を完了できます。