Skip to content

PL/SQL语法

PL/SQL语法结构

PL/SQL的程序结构由三部分组成:声明部分、可执行部分以及异常处理部分。

主要结构说明

每个PL/SQL语句以分号结尾。 使用BEGIN和END可以将PL/SQL块嵌套在其他PL/SQL块中。 以下是PL/SQL块的基本结构。

sql
DECLARE
-- 声明部分(可选)
<declarations section> 
BEGIN 
-- 可执行部分
<executable command(s)> 
EXCEPTION 
-- 异常处理部分(可选)
<exception handling> 
END;

说明:

  • 在Console控制台执行时,匿名语句块最后需要添加/标识结束,在其他管理工具执行时无需添加/
  • PL/SQL语言有着较强的结构性限制,存在BEGIN时必须对应一个END标识结束。分支语句或嵌套语句块也需要明确的END标识。
  • 使用较多的逻辑嵌套时,需要注意逻辑递进关系。执行区域的操作都需以分号结尾。

声明部分(DECLARE)

(可选部分)此部分是以关键字DECLARE开头,定义了程序中要使用的所有变量、类型、游标、异常、子程序和其他元素。变量用于存储数据,游标用于从数据库中提取数据。

语法格式

sql
DECLARE VarDefList

VarDefList::=
    VarDef ;    
|   VarDefList VarDef ;  

VarDef::=
    name [CONSTANT] TypeName
|   CursorDef
|   ExceptionDef 
|   TypeDefStmt
|   PRAGMA EXCEPTION_INIT (name,integer) 

TypeDefStmt::=
    {TYPE | SUBTYPE} ColId IS TypeName
    
TypeName::=
    STypename
|   TABLE OF STypename [INDEX BY STypename]
|   VARRAY (ICONST) OF STypename
|   VARYING ARRAY (ICONST) OF STypename

STypename::=
    ConstTypename
|   name_space ['%' ROWTYPE|'%' ROW TYPE|'%' TYPE]]
|   {ROWTYPE | ROW TYPE | TYPE} OF name_space
|   REF CURSOR
|   RECORD (col_defs)

参数说明

  • name [CONSTANT] TypeName:普通变量,定义了一个变量或常量。其中name是变量名,[CONSTANT]是一个可选关键字,用来指定该变量是否为常量,TypeName指定了变量的数据类型。
  • CursorDef:游标定义,游标是一种数据库对象,允许逐行处理查询结果集。
  • ExceptionDef:异常定义,用于定义用户自定义的异常。
  • TypeDefStmt:类型定义,用于定义新的数据类型。
  • PRAGMA EXCEPTION_INIT (name, integer):异常初始化,它将用户定义的异常与特定的错误代码关联起来。这里的name是异常名称,integer是错误代码。
  • STypename:定义了基本类型,包括常量类型、命名空间引用、记录类型、REF CURSOR类型等。
  • ConstTypename:定义了具体的常量类型,包括数值类型、字符类型、日期时间类型、RAW类型和BINARY类型。

说明

各定义的详细信息请参见《SQL语法参考指南》的各对应章节。

可执行部分以及异常处理部分(BEGIN...END)

  • 可执行命令部分:此部分包含在关键字BEGIN和END之间,这是一个强制性部分。它由程序的可执行PL/SQL语句组成。它应该有至少一个可执行代码行,它可以只是一个NULL命令,表示不执行任何操作。

  • 异常处理部分:(可选部分)此部分以关键字EXCEPTION开头。它包含处理程序中错误的异常。可以捕获并处理预定义的异常,也可以处理用户定义的异常。

语法格式

sql
BEGIN
  [<<ColId>> | ColId :] pl_stmt ...
  [OptExceptionStmt]
END

pl_stmt::=
    VarAssign
|   IfElseStmt
|   LoopStmt
|   ForStmt
|   ForallStmt
|   ThrowStmt
|   CaseStmt
|   GotoStmt
|   BreakStmt
|   ContinueStmt
|   ReturnStmt
|   NULL ;
|   ProcDef ; 
|   sql_stmt ;
|   StmtBlock [;]

参数说明

  • <<ColId>> | ColId ::可选标签,标记一段代码。
  • pl_stmt:可以是一个或多个的过程化语句。
  • OptExceptionStmt:异常处理部分。
  • VarAssign:变量赋值语句。
  • IfElseStmt:IF条件语句。
  • LoopStmt:LOOP循环语句。
  • ForStmt:FOR循环语句。
  • ForallStmt:批量操作语句。
  • ThrowStmt:抛出异常的语句。
  • CaseStmt:CASE选择语句。
  • GotoStmt:无条件跳转语句。
  • BreakStmt:跳出循环。
  • ContinueStmt:继续下一次循环。
  • ReturnStmt:返回函数结果。
  • NULL ;:空语句。
  • ProcDef ;:过程定义语句,定义一个新的过程或函数。
  • sql_stmt ;:SQL 语句,可以直接在PL/SQL中执行SQL操作。
  • StmtBlock [;]:嵌套的可执行命令部分,可以在当前语句块中定义另一个语句块。

说明

各语句的详细信息请参见《SQL语法参考指南》的各对应章节。

示例

定义变量

块语句中的变量,在声明部分(DECLARE和BEGIN之间)定义。

sql
DECLARE
    -- 简单数据类型变量
    v_int INT;
    v_char VARCHAR;
    -- 自定义数据类型变量
    --   (1) 定义“自定义类型”
    TYPE TYPE_VARRAY_INT IS VARRAY(5) OF PLS_INTEGER;
    --   (2) 定义“自定义类型”的变量
    v_varray_int TYPE_VARRAY_INT;
    -- 游标变量
    CURSOR v_cur IS SELECT name, age FROM tab_students WHERE student_id < 10;
BEGIN
    ...
END;

变量赋值

块语句中的变量,既可以在定义的同时赋值,也可以在“执行体”(BEGIN和END之间)赋值。在执行体中有两种语法对变量进行赋值:一种是用赋值符号 := ,另一种是用select into语法。

sql
SQL> DECLARE
        v_int INT;
        v_char VARCHAR;
        -- 在变量定义的同时进行赋值
        v_float FLOAT := 12.3;
    BEGIN
        -- 在执行体中给变量赋值
        -- 1. 用赋值符号给变量赋值
        v_int := 10;
        -- 2. 用 select into 语法给变量赋值
        SELECT 'string' INTO v_char;
        -- 把各变量的值打印至屏幕
        SEND_MSG('Value of v_int is: ' || v_int);
        SEND_MSG('Value of v_char is: ' || v_char);
        SEND_MSG('Value of v_float is: ' || v_float);
    END;
    /
-- 输出
Value of v_int is: 10
Value of v_char is: string
Value of v_float is: 12.3