无论程序是存储过程、函数、子程序还是触发器,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)。declarations 是块局部的一个或多个变量、游标、类型或子程序声明。如果包括子程序声明,则它们必须在所有其他变量、游标和类型声明之后。每个声明必须以分号结束。关键字 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