user1408057
user1408057

Reputation: 85

Create Oracle Package Body

I am trying to lay the foundation for a package but am having trouble even getting started. I have successfully created a basic package spec and want to just test the package body but I'm having trouble getting it to compile. The spec code is:

CREATE OR REPLACE PACKAGE synchronize_my_data 
AS
  PROCEDURE synchronize_data(p_run_date IN date);
END synchronize_my_data;

and here is the package body code:

CREATE OR REPLACE PACKAGE BODY synchronize_my_data 
IS
  PROCEDURE synchronize_data(p_run_date IN date) IS
      PROCEDURE process_deletes(p_run_date IN date) IS
      BEGIN
          dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));      
      END process_deletes;
  BEGIN
    process_deletes(p_run_date);
  END synchronize_data;

END synchronize_my_data;

I keep getting a compilation error but can't figure out what's wrong with the code. It seems like basic code, am I just missing something obvious?

Upvotes: 4

Views: 15883

Answers (1)

Justin Cave
Justin Cave

Reputation: 231651

That code seems to compile for me. What error are you getting?

SQL> CREATE OR REPLACE PACKAGE synchronize_my_data
  2  AS
  3    PROCEDURE synchronize_data(p_run_date IN date);
  4  END synchronize_my_data;
  5  /

Package created.

SQL> CREATE OR REPLACE PACKAGE BODY synchronize_my_data
  2  IS
  3    PROCEDURE synchronize_data(p_run_date IN date) IS
  4        PROCEDURE process_deletes(p_run_date IN date) IS
  5        BEGIN
  6            dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));
  7        END process_deletes;
  8    BEGIN
  9      process_deletes(p_run_date);
 10    END synchronize_data;
 11
 12  END synchronize_my_data;
 13  /

Package body created.

From a general stylistic standpoint, it generally makes very little sense to define a procedure within another procedure in a package body. One of the benefits of using packages is that you can have both public and private procedures. You can create the process_deletes procedure as a private procedure simply by defining it in the body without defining it in the spec.

CREATE OR REPLACE PACKAGE BODY synchronize_my_data 
IS
  PROCEDURE process_deletes(p_run_date IN date) 
  IS
  BEGIN
      dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));      
  END process_deletes;

  PROCEDURE synchronize_data(p_run_date IN date) 
  IS
  BEGIN
    process_deletes(p_run_date);
  END synchronize_data;

END synchronize_my_data;

That shouldn't have anything to do with whatever error you're getting. But it should make your code easier to deal with.

Upvotes: 7

Related Questions