プログラムがプロシージャ、関数、サブプログラム、トリガーのいずれであるかに関係なく、SPL プログラムは同じブロック構造を持っています。 ブロックは最大 3 つのセクションで構成されます。省略可能な宣言セクション、必須の実行可能セクション、および省略可能な例外セクションです。 ブロックには、1 つ以上の SPL 文で構成される実行可能セクションが (キーワード BEGIN および END で囲われて) 少なくとも 1 つ必要です。
省略可能な宣言セクションは、実行可能セクションと例外セクション内の文によって使用される変数、カーソル、型、およびサブプログラムを宣言するために使用されます。 宣言は、実行可能セクションの BEGIN キーワードの前に記述する必要があります。 ブロックが使用される状況に応じて、宣言セクションはキーワード DECLARE で始まる場合があります。
BEGIN - END ブロック内には、例外セクションを挿入することができます。 例外セクションは、キーワード EXCEPTION で始まり、それが出現するブロックの終わりまで続きます。 ブロック内の文によって例外がスローされた場合、プログラムの制御は例外セクションに移り、例外と例外セクションの内容に応じて、スローされた例外が処理されたり処理されなかったりします。
次の内容は、ブロックの一般的な構造を示しています。
[ [ DECLARE ]
pragmas
declarations ]
BEGIN
statements
[ EXCEPTION
WHEN exception_condition THEN
statements [, ...] ]
END;
pragmas はディレクティブです (現在サポートされているプラグマは、AUTONOMOUS_TRANSACTION です)。declarations は、ブロックに対してローカルな 1 つ以上の変数、カーソル、型、またはサブプログラムの宣言です。 サブプログラム宣言が含まれている場合は、他のすべての変数、カーソル、および型宣言の後に宣言する必要があります。 各宣言はセミコロン (;) で終了する必要があります。 キーワード DECLARE の使用は、ブロックが記述されるコンテキストによって異なります。
statements は、1 つ以上の SPL 文です。 各文はセミコロン (;) で終了する必要があります。 キーワード END で示されるブロックの終わりも、セミコロン (;) で終了する必要があります。
キーワード EXCEPTION が存在する場合、例外セクションの始まりを示します。exception_condition は、1 つ以上の型の例外をテストする条件式です。 例外が exception_condition の例外の 1 つと一致する場合、WHEN exception_condition 句に続く文が実行されます。 WHEN exception_condition 句 (および後続する文) が 1 つ以上存在する場合があります。 注:BEGIN/END ブロックは 1 つの文と見なすことができます。 したがって、ブロックをネストすることができます。 例外セクションには、ネストされたブロックが含まれる場合もあります。
次の内容は、実行可能セクション内が NULL 文で構成される最も単純なブロックについて説明しています。 NULL 文は、何の操作も実行しない実行可能文です。
BEGIN
NULL;
END;
次の内容は、宣言セクションと実行可能セクションからなるブロックについて説明しています。
DECLARE
v_numerator NUMBER(2);
v_denominator NUMBER(2);
v_result NUMBER(5,2);
BEGIN
v_numerator := 75;
v_denominator := 14;
v_result := v_numerator / v_denominator;
DBMS_OUTPUT.PUT_LINE(v_numerator || ' divided by ' || v_denominator ||
' is ' || v_result);
END;
この例では、データ型が NUMBER である 3 つの数値変数が宣言されています。 値が 2 つの変数に代入され、一方の数値がもう一方の数値で除算され、結果が 3 番目の変数に格納されて表示されます。 実行すると、次の出力が生成されます。
75 divided by 14 is 5.36
次の内容は、宣言セクション、実行可能セクション、および例外セクションからなるブロックについて説明しています。
DECLARE
v_numerator NUMBER(2);
v_denominator NUMBER(2);
v_result NUMBER(5,2);
BEGIN
v_numerator := 75;
v_denominator := 0;
v_result := v_numerator / v_denominator;
DBMS_OUTPUT.PUT_LINE(v_numerator || ' divided by ' || v_denominator ||
' is ' || v_result);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An exception occurred');
END;
次の出力は、ゼロによる除算の結果として、例外セクション内の文が実行されることを示しています。
An exception occurred