Oracle 包装规范中的程序
我有一个名为save\u db\u values的包 我有两个名为存储\u记录的过程,另一个名为db\u活动。 db\u activities将通过传递db\u activities中的所有值,从我的应用程序调用db\u activities,我将调用store\u records过程进行插入和删除 我是否需要在包装规范中定义存储记录的程序?当我没有在规范中定义store_记录时,我得到的错误Oracle 包装规范中的程序,oracle,stored-procedures,plsql,scope,package,Oracle,Stored Procedures,Plsql,Scope,Package,我有一个名为save\u db\u values的包 我有两个名为存储\u记录的过程,另一个名为db\u活动。 db\u activities将通过传递db\u activities中的所有值,从我的应用程序调用db\u activities,我将调用store\u records过程进行插入和删除 我是否需要在包装规范中定义存储记录的程序?当我没有在规范中定义store_记录时,我得到的错误store_记录未在此范围内声明。 存储_记录我不想公开的过程,因此我没有添加规范。 如何解决此问题?您
store_记录未在此范围内声明。
存储_记录我不想公开的过程,因此我没有添加规范。
如何解决此问题?您可以在正文中声明过程,但它们出现的顺序是相关的;调用过程必须在被调用过程之后定义。或者您可以使用转发声明来简化:
package save_db_values is
procedure db_activities;
end save_db_values;
package body save_db_values is
procedure store records; -- forward declaration
procedure db_activities is
begin
store_records;
end;
procedure store records is
begin
null;
end;
end save_db_values;
如果您不希望某些过程公开,您可以不在包规范中声明它们。仅在包体中声明它们。您面临的错误的原因是程序在包体中的声明顺序或缺少前向声明。例如:
create or replace package Test_pkg as
2 procedure Proc1;
3 end;
4 /
Package created
create or replace package body Test_pkg as
2
3 procedure proc1 is
4 begin
5 proc2;
6 end;
7
8 procedure Proc2 is
9 begin
10 dbms_output.put_line('proc2 is being executed');
11 end;
12
13 end;
14 /
Warning: Package body created with compilation errors
Error: PLS-00313: 'PROC2' not declared in this scope
之所以发生这种情况,是因为我们正在调用包中稍后声明的Proc2
。在这种情况下,我们的选择是:
在调用pro2的过程之前声明pro2
create or replace package body Test_pkg as
2
3
4 procedure Proc2 is
5 begin
6 dbms_output.put_line('proc2 is being executed');
7 end;
8
9 procedure proc1 is
10 begin
11 proc2;
12 end;
13
14 end;
15 /
Package body created
使用转发声明
create or replace package body Test_pkg as
2
3 procedure Proc2;
4
5 procedure proc1 is
6 begin
7 proc2;
8 end;
9
10 procedure Proc2 is
11 begin
12 dbms_output.put_line('proc2 is being executed');
13 end;
14
15
16 end;
17 /
Package body created
SQL> exec test_pkg.Proc1;
proc2 is being executed
PL/SQL procedure successfully completed
这是因为在包体中写入过程体。 如果您没有在包规范中声明任何过程,那么您应该首先编写它 它将起作用:)