PLS-00313 'XXXXX' not declared in this scope

本文详细解析了在Oracle PL/SQL中,如何正确地在一个Package的Body内调用未在Specification中声明的私有Procedure或Function。通过实例说明了Procedure的声明与调用顺序对编译的影响,并提供了避免错误PLS-00313的正确做法。
                Package中私有的Procedure/Function(没在Package Specification声明)需要注意放置的位置

比如下面的Package,Procedure A 想要调用 Procedure B,
CREATE OR REPLACE PACKAGE AAAAA AUTHID CURRENT_USER AS  PROCEDURE A;END AAAAA;
CREATE OR REPLACE PACKAGE BODY AAAAA AS  PROCEDURE A IS  BEGIN    B;  END;  PROCEDURE B IS  BEGIN    dbms_output.put_line('In PROCEDURE B');  END ;END AAAAA;
会报错: PLS-00313: 'B' not declared in this scope


原因: B不是Public的Procedure,如果A想调用B,那么B的定义必须放在A的前边。

PLS-00313: "string" not declared in this scope
Cause: There is no declaration for the given identifier within the scope of reference. The identifier might be misspelled, its declaration might be faulty, or the declaration might be placed incorrectly in the block structure.
Action: Check the spelling and declaration of the identifier. Also confirm that the declaration is placed correctly in the block structure.


所以正确的写法是:
CREATE OR REPLACE PACKAGE BODY AAAAA AS  PROCEDURE B IS  BEGIN    dbms_output.put_line('In PROCEDURE B');  END ;   PROCEDURE A IS  BEGIN    B;  ENDEND AAAAA;
或者,如果确实想把B放到后边,那么可以在前面声明下,这样后边不过谁调用,也不会报错,这也是一个很好的习惯。
CREATE OR REPLACE PACKAGE BODY AAAAA AS  PROCEDURE B;   PROCEDURE A IS  BEGIN    B;  END;  PROCEDURE B IS  BEGIN    dbms_output.put_line('In PROCEDURE B');  END ;END AAAAA;


Reference:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:11471812249709



           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

PLS-00313 错误表明在当前作用域中未声明 `UPDATE_INVALID_A`。这通常意味着在调用 `update_invalid_a` 这个子程序(可能是存储过程或函数)时,该子程序未在当前块、包或模式中进行声明。 以下是可能的解决方案: #### 1. 检查子程序是否存在 首先要确认 `update_invalid_a` 子程序是否确实存在于数据库中。可以通过以下 SQL 查询来检查: ```sql SELECT object_name, object_type FROM all_objects WHERE object_name = 'UPDATE_INVALID_A'; ``` 如果查询没有返回结果,说明该子程序可能未被创建。 #### 2. 确认子程序的声明和定义 如果子程序存在,要确保它在当前代码块的作用域内是可见的。 **情况一:如果 `update_invalid_a` 是一个独立的存储过程或函数** 要确保当前用户有执行该子程序的权限。可以使用以下语句授予权限: ```sql GRANT EXECUTE ON update_invalid_a TO your_user; ``` 同时,在调用时要确保使用正确的模式名(如果子程序不在当前用户的模式下)。例如: ```plsql -- 如果子程序在另一个模式(例如 other_schema)下 other_schema.update_invalid_a(p_project_id => p_project_id); ``` **情况二:如果 `update_invalid_a` 是一个包内的子程序** 要确保已经正确声明和定义了该包。示例如下: ```plsql -- 包声明 CREATE OR REPLACE PACKAGE my_package IS PROCEDURE update_invalid_a(p_project_id NUMBER); END my_package; / -- 包体定义 CREATE OR REPLACE PACKAGE BODY my_package IS PROCEDURE update_invalid_a(p_project_id NUMBER) IS BEGIN -- 子程序的具体逻辑 NULL; END update_invalid_a; END my_package; / -- 调用包内的子程序 DECLARE p_project_id NUMBER := 1; BEGIN my_package.update_invalid_a(p_project_id => p_project_id); END; ``` #### 3. 检查拼写和大小写 要确保在调用时子程序名的拼写和大小写与声明时一致。PL/SQL 是区分大小写的,除非标识符用双引号括起来。 #### 4. 检查作用域 如果 `update_invalid_a` 是在某个包或匿名块中声明的,要确保当前调用位置在其作用域内。 ### 示例代码 以下是一个完整的示例,展示了如何定义和调用一个存储过程: ```plsql -- 创建存储过程 CREATE OR REPLACE PROCEDURE update_invalid_a(p_project_id NUMBER) IS BEGIN -- 存储过程的具体逻辑 DBMS_OUTPUT.PUT_LINE('Processing project ID: ' || p_project_id); END update_invalid_a; / -- 调用存储过程 DECLARE p_project_id NUMBER := 1; BEGIN update_invalid_a(p_project_id => p_project_id); END; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值