無論程序是存儲過程、函數、子程序還是觸發器,SPL 程序都具有相同的塊結構。一個塊最多包含三個部分 - 可選的聲明部分,必需的可執行部分以及可選的異常部分。塊至少要有一個可執行部分,其中包含一條或多條SPL語句,位于關鍵字BEGIN與END之間。

可選的聲明部分用于聲明可執行和異常部分中的語句使用的變量、游標、類型和子程序。聲明僅在可執行部分的BEGIN關鍵字之前顯示。根據使用塊的上下文,聲明部分可能以關鍵字DECLARE開頭。

您可以在BEGIN - END塊內包括異常部分。異常部分以關鍵字EXCEPTION開頭,繼續直到其顯示的塊末尾。如果塊中的語句引發異常,程序控制將轉到異常部分,根據異常和異常部分的內容,可能會也可能不會處理引發的異常。

以下是塊的一般結構:

[ [ DECLARE ]
 pragmas
 declarations ]
    BEGIN
 statements
  [ EXCEPTION
      WHEN exception_condition THEN
 statements [, ...] ]
    END;

pragmas是指令(AUTONOMOUS_TRANSACTION是當前支持的pragma)。declaration是塊局部的一個或多個變量、游標、類型或子程序聲明。如果包括子程序聲明,則它們必須在所有其他變量、游標和類型聲明之后。每個聲明必須以分號結束。關鍵字 DECLARE 的使用取決于顯示塊的上下文。

statements是一條或多條SPL語句。每條語句必須以分號結束。關鍵字END表示的塊結尾也必須以分號結束。

如果存在,關鍵字EXCEPTION標記異常部分的開頭。exception_condition是測試一種或多種類型異常的條件表達式。如果異常匹配exception_condition中的異常之一,則執行后跟WHEN exception_condition子句的statements。可能會有一個或多個WHEN exception_condition子句,各自后跟statements。注:BEGIN/END塊本身可視為一條語句,因此塊可以嵌套。異常部分也可能包含嵌套的塊。

以下內容是可執行部分中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聲明三個數字變量。將值分配給其中兩個變量,然后將一個數字除以另一個,將結果存儲在第三個變量中,然后顯示該變量。如果執行,輸出將為:

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