無論程序是存儲過程、函數、子程序還是觸發器,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