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.

一般的な文体の観点から、パッケージ本体の別のプロシージャ内でプロシージャを定義することは、一般的にほとんど意味がありません。パッケージを使用する利点の1つは、パブリックとプライベートの両方の手順を実行できることです。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 に答える