ストアドプログラムの構文には、主にBEGIN ... ENDブロック、DECLARE宣言、およびステートメントタグの3つの部分が含まれます。
BEGIN ... END ブロック
BEGIN ... END ブロックは複合ステートメントをサポートしており、ストアドプログラム(ストアドプロシージャ、ストアド関数、トリガー)の作成に使用されます。
BEGIN ... END 複合ステートメントには複数のステートメントを含めることができ、BEGIN と END のキーワードで囲まれます。構文は以下のとおりです:
[begin_label:] BEGIN
[statement_list]
END [end_label]
ここで、statement_list は1つ以上のステートメントのリストを表し、各ステートメントはセミコロン(;)で終了します。statement_list はオプションであるため、空の複合ステートメント BEGIN END も有効です。
BEGIN ... END ブロックはネストをサポートします。BEGIN ... END はまた、タグ付けすることもできます。詳細については、ステートメントタグ を参照してください。
PLストアドプログラムのデフォルトの区切り文字は「/」です。ユーザーは delimiter コマンドを使用してカスタム区切り文字を定義し、定義全体を単一のステートメントとしてサーバーに渡すこともできます。区切り文字は1文字または複数の文字で構成できますが、エスケープ文字として一般的に使用されるバックスラッシュ(\)文字は避けるべきです。例:
DELIMITER $$
DELIMITER //
説明
OceanBaseデータベースを使用した開発では、通常カスタム区切り文字を定義する必要があります。PLブロック内部の定義に ; で区切られたステートメントが含まれない場合、区切り文字を使用する必要はありません。
DECLARE宣言
DECLARE ステートメントは、プログラムのローカル変数、例外処理、カーソルを定義するために使用されます。詳細については、それぞれ ストアドプログラムの変数、例外処理、カーソル を参照してください。
DECLARE は BEGIN ... END ブロック内でのみ使用が許可され、その開始位置、つまり他のステートメントの前に記述する必要があります。
宣言は次の順序に従う必要があります:
カーソル宣言は例外処理プログラムの宣言より前に記述する必要があります。
変数と条件の宣言は、カーソルまたは例外処理プログラムの宣言より前に記述する必要があります。
ステートメントラベル
ラベルはBEGIN ... ENDブロックのLOOP、REPEAT、およびWHILEステートメントで使用できます。構文は次のとおりです:
[begin_label:] BEGIN
[statement_list]
END [end_label]
[begin_label:] LOOP
statement_list
END LOOP [end_label]
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
これらのステートメントのラベルには、以下の使用規則が適用されます:
begin_labelの後には必ずコロンを付ける必要があります。begin_labelはend_labelなしで指定できます。end_labelが存在する場合は、begin_labelと同じである必要があります。begin_labelがない場合、end_labelを指定することはできません。同じネストレベルのラベルは異なるものでなければなりません。
ラベルは最大16文字までです。
既に作成されたラベルを参照するには、ITERATEまたはLEAVEステートメントを使用します。次の例は、ラベルを使用してステートメントを続行またはループを終了する方法を示しています:
obclient> DELIMITER //
obclient> CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN ITERATE label1; END IF;
LEAVE label1;
END LOOP label1;
END //
Query OK, 0 rows affected
ブロック内の例外ハンドラー宣言については、DECLARE ... HANDLERを参照してください。