4

我正在尝试为包装奠定基础,但即使开始也遇到了麻烦。我已经成功创建了一个基本的包规范,并且只想测试包体,但我无法编译它。规范代码是:

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

这是包体代码:

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;

我不断收到编译错误,但无法弄清楚代码有什么问题。这似乎是基本代码,我只是错过了一些明显的东西吗?

4

1 回答 1

7

该代码似乎为我编译。你遇到了什么错误?

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.

从一般风格的角度来看,在包体内的另一个过程中定义一个过程通常没有什么意义。使用包的好处之一是您可以同时拥有公共和私有过程。您可以process_deletes通过在主体中定义它而不在规范中定义它来将过程创建为私有过程。

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;

这不应该与您遇到的任何错误有关。但它应该使您的代码更容易处理。

于 2012-12-07T20:37:59.793 回答