2012-10-03 35 views
10

Tôi có một gói có tên save_db_values ​​Thủ tục trong gói đặc điểm kỹ thuật

Tôi có hai thủ tục đặt tên store_records và một số khác gọi db_activities. db_activities sẽ được gọi từ ứng dụng của tôi bằng cách đi qua tất cả các giá trị trong db_activities tôi sẽ được gọi store_records thủ tục để làm chèn và xóa.

Tôi có cần xác định quy trình store_records trong đặc tả gói không? Khi tôi không xác định store_records trong đặc điểm kỹ thuật tôi nhận được lỗi store_records not declared in this scope.

store_records thủ tục Tôi không muốn để lộ và do đó tôi không thêm đặc điểm kỹ thuật. Tôi làm cách nào để giải quyết vấn đề này?

Trả lời

26

Nếu bạn không muốn một số thủ tục để được công bố rộng rãi bạn có thể không phải khai báo trong đặc tả gói. Khai báo chúng chỉ trong phần thân gói. Nguyên nhân của lỗi bạn đang gặp phải là thứ tự khai báo của các thủ tục trong phần thân gói hoặc thiếu khai báo chuyển tiếp. Ví dụ:

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 

Điều này xảy ra vì chúng tôi đang gọi Proc2 được khai báo sau trong gói. Trong trường hợp này sự lựa chọn của chúng tôi là:

Declare pro2 trước khi các thủ tục mà gọi nó

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 

Sử dụng phía trước tuyên bố.

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 
+0

Cảm ơn rất nhiều vì đã chỉ ra lỗi – user75ponic

2

Bạn có thể khai báo các thủ tục ngay trong cơ thể, nhưng thứ tự mà chúng xuất hiện có liên quan; thủ tục gọi phải được xác định sau thủ tục được gọi. Hoặc bạn sử dụng một bản tuyên bố về phía trước để làm cho nó dễ dàng hơn:

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; 
+0

Cảm ơn rất nhiều vì đã chỉ ra lỗi. – user75ponic

0

Điều này xảy ra do phần thân của thủ tục viết trong phần thân gói. nếu bạn không khai báo bất kỳ quy trình nào trong đặc tả gói thì bạn nên viết nó ở vị trí đầu tiên.

nó sẽ hoạt động :)

Các vấn đề liên quan