无论程序是存储过程、函数、子程序还是触发器,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