我有一个问题,但我没有从谷歌找到答案。这可能是一个简单的问题,因为我是初学者我有这个疑问。
我们可以在包规范中声明一个函数并使用相同的函数进行前向声明吗?
CREATE OR REPLACE PACKAGE pckg_test IS
FUNCTION fun_test(ID NUMBER) RETURN NUMBER;
PROCEDURE proc_test (id number);
END pckg_test ;
CREATE OR REPLACE PACKAGE BODY pckg_test IS
FUNCTION fun_test(ID NUMBER) RETURN NUMBER; --fwd declaration
PROCEDURE proc_test (id number) is
BEGIN
....
calling fun_test
....
END;
FUNCTION fun_test(ID NUMBER) RETURN NUMBER is
BEGIN
....
END;
END pckg_test;
您不能(转发)在主体中声明该函数,因为它已经在规范中声明了。
这很容易测试,只需填写非常小的伪代码:
CREATE OR REPLACE PACKAGE pckg_test IS
FUNCTION fun_test(ID NUMBER) RETURN NUMBER;
PROCEDURE proc_test (id number);
END pckg_test ;
/
Package PCKG_TEST compiled
CREATE OR REPLACE PACKAGE BODY pckg_test IS
FUNCTION fun_test(ID NUMBER) RETURN NUMBER; --fwd declaration
PROCEDURE proc_test (id number) is
x number;
BEGIN
x := fun_test(1);
END;
FUNCTION fun_test(ID NUMBER) RETURN NUMBER is
BEGIN
return 42;
END;
END pckg_test;
/
Package Body PCKG_TEST compiled
LINE/COL ERROR
--------- -------------------------------------------------------------
2/1 PLS-00305: previous use of 'FUN_TEST' (at line 2) conflicts with this use
2/1 PL/SQL: Item ignored
2/10 PLS-00328: A subprogram body must be defined for the forward declaration of FUN_TEST.
Errors: check compiler log
PLS-00305 是因为您的前向声明与包规范中的相同(名称和数据类型)。
PLS-00328 有点误导;的完整声明fun_test
似乎与公共规范相关联,而前向声明 - 即使它本身抛出错误 - 然后没有匹配的完整声明。
如果您只是删除或注释掉前向声明,则它编译成功:
CREATE OR REPLACE PACKAGE BODY pckg_test IS
--FUNCTION fun_test(ID NUMBER) RETURN NUMBER; --fwd declaration
PROCEDURE proc_test (id number) is
x number;
BEGIN
x := fun_test(1);
END;
FUNCTION fun_test(ID NUMBER) RETURN NUMBER is
BEGIN
return 42;
END;
END pckg_test;
/
Package Body PCKG_TEST compiled
您不需要(并且不被允许)fun_test
在包体内进行前向声明,因为它是在包规范中公开声明的 - 该公共规范使该函数在整个包体内都可用。因此,即使它在正文代码中排在第一位,proc_test
仍然可以调用fun_test
。公共规范与前向声明具有相同的效果。
所以这意味着我只能为私有子程序提供 fwd 声明?
是的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句