包中的前向声明

萨斯

我有一个问题,但我没有从谷歌找到答案。这可能是一个简单的问题,因为我是初学者我有这个疑问。

我们可以在包规范中声明一个函数并使用相同的函数进行前向声明吗?

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SpriteKit中的前向声明

来自分类Dev

在Python中实现函数的前向声明

来自分类Dev

Clojurescript中的函数前向声明

来自分类Dev

ANN库中的前向声明

来自分类Dev

C ++中的前向声明错误

来自分类Dev

类中的C ++前向声明类

来自分类Dev

C ++中的前向声明错误

来自分类Dev

参数中的前向声明与“常规”前向声明之间的区别

来自分类Dev

使用前向声明类中的友元函数前向声明的单例类

来自分类Dev

typedef的前向声明

来自分类Dev

在Nim中为函数指针分配前向声明的原型

来自分类Dev

前向声明是C ++程序中的唯一选项吗?

来自分类Dev

在c ++ 11中使用的前向声明

来自分类Dev

C ++中include指令和前向声明之间的区别

来自分类Dev

类中的枚举前向声明是否可能?

来自分类Dev

C中的前向结构声明;不工作

来自分类Dev

元组中的前向声明和交叉引用

来自分类Dev

在C编程中前向声明的意义是什么?

来自分类Dev

指向C中的前向声明结构数组的指针

来自分类Dev

C ++使前向声明失败-在docker中运行

来自分类Dev

子类在Objective-C中的前向声明

来自分类Dev

在c ++ 11中使用的前向声明

来自分类Dev

前向声明还是#include?

来自分类Dev

省略前向声明(原型)

来自分类Dev

typedef类的前向声明

来自分类Dev

C ++前向声明设计

来自分类Dev

NSImage前向声明错误

来自分类Dev

功能LLVM的前向声明

来自分类Dev

球拍:接口的前向声明