Eri*_*rik 0 oracle plsql anonymous-function oracle11g oracle19c
当我尝试运行此代码时
DECLARE
TYPE type_a IS
TABLE OF NUMBER INDEX BY PLS_INTEGER;
output NUMBER := 1;
FUNCTION fun_2 RETURN type_a IS
dum type_a;
BEGIN
SELECT
employee_id
BULK COLLECT
INTO dum
FROM
employees;
RETURN dum;
END fun_2;
PROCEDURE proc_1 AS
BEGIN
NULL;
END;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误报告 - ORA-06550:第 22 行,第 8 列:PLS-00103:在预期以下情况之一时遇到符号“文件结束”:
begin function pragma procedure 06550. 00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。*行动:
但是当我最后添加 BEGIN END 时它工作正常
DECLARE
TYPE type_a IS
TABLE OF NUMBER INDEX BY PLS_INTEGER;
output NUMBER := 1;
FUNCTION fun_2 RETURN type_a IS
dum type_a;
BEGIN
SELECT
employee_id
BULK COLLECT
INTO dum
FROM
employees;
RETURN dum;
END fun_2;
PROCEDURE proc_1 AS
BEGIN
NULL;
END;
BEGIN
null ;
END;
Run Code Online (Sandbox Code Playgroud)
我得到了答案,但这是为什么呢?我的意思是代码是如何执行的,为什么需要它?
PL/SQL 块具有结构DECLARE ... BEGIN ... END;. 的DECLARE,如果你想声明的任何变量等是可选的,但BEGIN ... END;是强制性的。
如果我们从一个简单的块开始并构建:
BEGIN
NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)
是最简单的PL/SQL语句。然后声明一个类型:
DECLARE
TYPE type_a IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
BEGIN
NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)
和一个变量:
DECLARE
TYPE type_a IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
output NUMBER := 1;
BEGIN
NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)
然后你DECLARE一个函数;这包括它自己的 PL/SQLBEGIN ... END;块,它将嵌套在DECLARE匿名外部块的部分中:
DECLARE
TYPE type_a IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
output NUMBER := 1;
FUNCTION fun_2 RETURN type_a IS
dum type_a;
BEGIN
SELECT employee_id
BULK COLLECT INTO dum
FROM employees;
RETURN dum;
END fun_2;
BEGIN
NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)
然后你声明一个程序;这再次包括它自己的 PL/SQLBEGIN ... END;块,该块将嵌套在DECLARE函数之后的匿名外部块的部分中:
DECLARE
TYPE type_a IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
output NUMBER := 1;
FUNCTION fun_2 RETURN type_a IS
dum type_a;
BEGIN
SELECT employee_id
BULK COLLECT INTO dum
FROM employees;
RETURN dum;
END fun_2;
PROCEDURE proc_1 AS
BEGIN
NULL;
END proc_1;
BEGIN
NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)
回到你的问题:
为什么需要它?
因为,否则你有两个BEGIN ... END;函数和过程块嵌套在DECLARE从第一行开始的部分中,但没有BEGIN ... END;与DECLARE第一行匹配的部分。
使用一致的缩进将有助于发现这一点。
| 归档时间: |
|
| 查看次数: |
25 次 |
| 最近记录: |