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