为什么PL/SQL匿名块末尾需要添加BEGIN END执行段?
问题原因及PL/SQL语法规则解释
核心错误原因
你遇到的报错是因为没有补全PL/SQL匿名块的必填执行段,不符合PL/SQL块的语法要求。
PL/SQL匿名块的标准结构
你写的带DECLARE开头的代码属于PL/SQL匿名块(一次性执行、不会存储到数据库中的PL/SQL代码块),它的语法强制要求包含执行段,完整结构如下:
[DECLARE -- 声明段:可选,用于定义变量、自定义类型、函数、存储过程、游标等 ] BEGIN -- 执行段:必填,是整个匿名块的执行入口,哪怕没有实际逻辑也要至少写一个NULL语句 [EXCEPTION -- 异常处理段:可选,用于捕获执行段抛出的异常 ] END;
你第一版代码只写了DECLARE开头的声明段,定义了集合类型、变量、自定义函数fun_2、存储过程proc_1,但没有写必填的BEGIN开头的执行段,所以Oracle解析代码到proc_1的END之后,没有找到预期的语法要素,直接读到文件末尾,就抛出了PLS-00103: 遇到符号"end-of-file"的错误。
你在末尾补上BEGIN NULL; END;之后,补全了匿名块的执行段,语法符合要求,因此可以正常运行。
PL/SQL匿名块的执行逻辑
匿名块的运行流程如下:
- 首先Oracle会对整个代码块做语法校验,检查结构是否完整、声明的对象是否合法,这一步如果有语法错误就会直接抛出你遇到的这类编译错误
- 语法校验通过后,执行逻辑从
BEGIN后的第一行代码开始运行 - 你在声明段定义的自定义函数、存储过程,只有在执行段中被调用时,才会实际运行内部逻辑
补充说明:如果你是要创建独立存储到数据库的函数/存储过程,不需要用
DECLARE开头,直接用CREATE FUNCTION/CREATE PROCEDURE开头编写命名块即可,这类块的语法结构和匿名块不同,不需要额外加外层的执行段。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

