【发布时间】:2021-09-01 06:55:05
【问题描述】:
当我尝试运行这段代码时
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;
我遇到以下错误:
错误报告 - ORA-06550:第 22 行,第 8 列:PLS-00103:遇到 预期以下之一时的符号“文件结尾”:
开始函数pragma过程 06550. 00000 - “第 %s 行,第 %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;
我得到了答案,但这是为什么呢?我的意思是代码是如何执行的,为什么需要它?
【问题讨论】:
-
你想完成什么?您正在声明一个匿名 PL/SQL 块本地的函数和过程,因此一旦块完成,它们就会消失。由于您没有调用它们,因此声明它们毫无意义。我的猜测是你想创建一个存储过程和一个存储函数(可以从其他块调用的持久对象)或一个包含过程和函数的包(这也将它们保存在数据库中)。
-
@Justin Cave 我不想要存储过程/函数只是我需要知道为什么错误发生在第一个代码而不是第二个代码中。这不是一个真实的场景,也不是我得到的任何任务,我只是想解决面试问题。我只想知道这两个代码是如何工作的。 :)
-
匿名块需要一个可执行部分。否则,它只是声明,并且为没有要执行的临时块声明是没有意义的。除了“PL/SQL 不允许只声明局部变量和局部对象但没有可执行部分的匿名块,因为这不是明智之举”跨度>
-
@ Justin Cave "一个匿名块需要一个可执行部分" 现在我明白我为什么需要它了...... :)
标签: oracle plsql oracle11g anonymous-function oracle19c