1

いくつかのディメンション用にいくつかの DDL/PLSQL を作成しているので、バックアップとして便利に使用でき、プロシージャ/関数を使用してすべてを自動化しています。私の質問では、日付ディメンションに焦点を当てています。私が直面している問題は、あるストアド プロシージャを別のストアド プロシージャから実行しようとすると、次のような一連のエラー メッセージが表示されることです。

  • [ORA-04068] パッケージの既存の状態が破棄されました。実行、変更、または削除されたストアド プロシージャではありません。
  • [ORA-04065] ストアド プロシージャ "ADMIN.NEW_DATE" は実行、変更、削除されていません
  • [ORA-06508] PL/SQLL は呼び出されているプログラム単位を見つけられませんでした: "ADMIN.NEW_DATE"
  • [ORA-06512] 「ADMIN.DATE_DIM_CREATE、85 行目」
  • [ORA-06512] 2行目

また、ストアド プロシージャの 1 つが、日付ディメンション テーブルに挿入される日付ディメンション値を処理する一連の関数を呼び出していることにも注意してください。

NEW_DATE を呼び出す最初のストアド プロシージャ DATE_DIM_CREATE のコードを次に示します。

create or replace 
PROCEDURE DATE_DIM_CREATE
    AUTHID CURRENT_USER
IS
    V_START_DATE DATE := TO_DATE('01/01/1900','MM/DD/YYYY');
    V_CURRENT_DATE  DATE := V_START_DATE;
    V_END_DATE DATE := TO_DATE('12/31/2099','MM/DD/YYYY');
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE "DATE_DIM" PURGE';

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = ''AMERICAN'' ';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY = ''AMERICA'' ';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = ''GREGORIAN'' ';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''MM/DD/YYYY'' ';

    EXECUTE IMMEDIATE
    'CREATE TABLE DATE_DIM
    (
        DATE_KEY NUMBER(8, 0) NOT NULL,  
        DATE_TYPE VARCHAR2(14),
        FULL_DATE DATE,
        FULL_DATE_REVERSE VARCHAR2(10),
        FULL_DATE_DESCRIPTION VARCHAR2(31),
        DAY_NUMBER NUMBER(2, 0),
        DAY_NAME VARCHAR2(9),
        DAY_SHORT VARCHAR2(3),
        FIRST_DAY_IN_MONTH DATE,
        LAST_DAY_IN_MONTH DATE,
        FIRST_DAY_IN_PREVIOUS_MONTH DATE,
        LAST_DAY_IN_PREVIOUS_MONTH DATE,
        FIRST_DAY_IN_NEXT_MONTH DATE,
        LAST_DAY_IN_NEXT_MONTH DATE,
        FIRST_DAY_IN_CALENDAR_QTR DATE,
        LAST_DAY_IN_CALENDAR_QTR DATE,
        FIRST_DAY_IN_PREV_CALENDAR_QTR DATE,
        LAST_DAY_IN_PREV_CALENDAR_QTR DATE,
        FIRST_DAY_IN_NEXT_CALENDAR_QTR DATE,
        LAST_DAY_IN_NEXT_CALENDAR_QTR DATE,
        FIRST_DAY_IN_CALENDAR_YEAR DATE,
        LAST_DAY_IN_CALENDAR_YEAR DATE,
        DAY_NUMBER_IN_CALENDAR_YEAR NUMBER(3, 0),
        FIRST_DAY_IN_FISCAL_QTR DATE,
        LAST_DAY_IN_FISCAL_QTR DATE,
        FIRST_DAY_IN_PREV_FISCAL_QTR DATE,
        LAST_DAY_IN_PREV_FISCAL_QTR DATE,
        FIRST_DAY_IN_NEXT_FISCAL_QTR DATE,
        LAST_DAY_IN_NEXT_FISCAL_QTR DATE,
        FIRST_DAY_IN_FISCAL_YEAR DATE,  
        LAST_DAY_IN_FISCAL_YEAR DATE,
        DAY_NUMBER_IN_FISCAL_YEAR NUMBER(3, 0),
        IS_WEEKDAY VARCHAR2(1),
        IS_WEEKEND VARCHAR2(1), 
        WEEK_IN_MONTH NUMBER(1, 0),
        WEEK_IN_CALENDAR_YEAR_ISO NUMBER(2, 0),
        WEEK_IN_FISCAL_YEAR_ISO NUMBER(2, 0),
        BEGIN_FULL_WEEK DATE,
        END_FULL_WEEK DATE,
        BEGIN_WORK_WEEK DATE,
        END_WORK_WEEK DATE,
        MONTH_NUMBER NUMBER(2, 0),
        MONTH_NAME VARCHAR(9),
        MONTH_SHORT VARCHAR(3),
        CALENDAR_QUARTER NUMBER(1, 0),
        CALENDAR_QUARTER_NAME VARCHAR2(11),
        CALENDAR_QUARTER_YEAR VARCHAR2(9),
        FISCAL_QUARTER NUMBER(1, 0),
        FISCAL_QUARTER_NAME VARCHAR2(11),
        FISCAL_QUARTER_YEAR VARCHAR2(9),
        CALENDAR_YEAR_NUMBER NUMBER(4, 0),
        CALENDAR_YEAR VARCHAR2(6),
        FISCAL_YEAR_NUMBER NUMBER(4, 0),
        FISCAL_YEAR VARCHAR2(6),
        IS_HOLIDAY VARCHAR2(1),
        IS_BUSINESS_DAY VARCHAR2(1),
        CONSTRAINT DATE_KEY_PK PRIMARY KEY (DATE_KEY)
    )';

EXECUTE IMMEDIATE
    'COMMENT ON TABLE DATE_DIM
    IS ''Date dimension table used for storing date attributes.'' ';
EXECUTE IMMEDIATE
    'COMMENT ON COLUMN DATE_DIM.DATE_KEY
    IS ''Date key is the primary/surrogate key for the date dimension table.'' ';

WHILE V_CURRENT_DATE <= V_END_DATE LOOP
    NEW_DATE(V_CURRENT_DATE);
    V_CURRENT_DATE := V_CURRENT_DATE + INTERVAL '1' DAY;
END LOOP;

NEW_DATE(TO_DATE('12/29/9999', 'MM/DD/YYYY'));
NEW_DATE(TO_DATE('12/30/9999', 'MM/DD/YYYY'));
NEW_DATE(TO_DATE('12/31/9999', 'MM/DD/YYYY'));

END DATE_DIM_CREATE;

そして、値をテーブルに挿入し、すべての関数を呼び出す NEW_DATE プロシージャを次に示します。

create or replace 
PROCEDURE NEW_DATE(P_DATE IN DATE)
    AUTHID CURRENT_USER
IS
BEGIN
    INSERT INTO DATE_DIM 
    (
        DATE_KEY,
        DATE_TYPE,
        FULL_DATE,
        FULL_DATE_REVERSE,
        FULL_DATE_DESCRIPTION,
        DAY_NUMBER,
        DAY_NAME,
        DAY_SHORT,
        FIRST_DAY_IN_MONTH,
        LAST_DAY_IN_MONTH,
        FIRST_DAY_IN_PREVIOUS_MONTH,
        LAST_DAY_IN_PREVIOUS_MONTH,
        FIRST_DAY_IN_NEXT_MONTH,
        LAST_DAY_IN_NEXT_MONTH,
        FIRST_DAY_IN_CALENDAR_QTR,
        LAST_DAY_IN_CALENDAR_QTR,
        FIRST_DAY_IN_PREV_CALENDAR_QTR,
        LAST_DAY_IN_PREV_CALENDAR_QTR,
        FIRST_DAY_IN_NEXT_CALENDAR_QTR,
        LAST_DAY_IN_NEXT_CALENDAR_QTR,
        FIRST_DAY_IN_CALENDAR_YEAR,
        LAST_DAY_IN_CALENDAR_YEAR,
        DAY_NUMBER_IN_CALENDAR_YEAR,
        FIRST_DAY_IN_FISCAL_QTR,
        LAST_DAY_IN_FISCAL_QTR,
        FIRST_DAY_IN_PREV_FISCAL_QTR,
        LAST_DAY_IN_PREV_FISCAL_QTR,
        FIRST_DAY_IN_NEXT_FISCAL_QTR,
        LAST_DAY_IN_NEXT_FISCAL_QTR,
        FIRST_DAY_IN_FISCAL_YEAR,
        LAST_DAY_IN_FISCAL_YEAR,
        DAY_NUMBER_IN_FISCAL_YEAR,
        IS_WEEKDAY,
        IS_WEEKEND,
        WEEK_IN_MONTH,
        WEEK_IN_CALENDAR_YEAR_ISO,
        WEEK_IN_FISCAL_YEAR_ISO,
        BEGIN_FULL_WEEK,
        END_FULL_WEEK,
        BEGIN_WORK_WEEK,
        END_WORK_WEEK,
        MONTH_NUMBER,
        MONTH_NAME,
        MONTH_SHORT,
        CALENDAR_QUARTER,
        CALENDAR_QUARTER_NAME,
        CALENDAR_QUARTER_YEAR,
        FISCAL_QUARTER,
        FISCAL_QUARTER_NAME,
        FISCAL_QUARTER_YEAR,
        CALENDAR_YEAR_NUMBER,
        CALENDAR_YEAR,
        FISCAL_YEAR_NUMBER,
        FISCAL_YEAR,
        IS_HOLIDAY,
        IS_BUSINESS_DAY
    ) 
    VALUES 
    (
        DATE_KEY_FX(P_DATE),                  --DATE_KEY
        DATE_TYPE_FX(P_DATE),                 --DATE_TYPE
        P_DATE,                               --FULL_DATE
        FULL_DATE_REVERSE_FX(P_DATE),         --FULL_DATE_REVERSE
        FULL_DATE_DESCRIPTION_FX(P_DATE),     --FULL_DATE_DESCRIPTION
        DAY_NUMBER_FX(P_DATE),                --DAY_NUMBER
        DAY_NAME_FX(P_DATE),                  --DAY_NAME
        DAY_SHORT_FX(P_DATE),                 --DAY_SHORT
        DAY_IN_MONTH_FX(P_DATE, 0, 0),        --FIRST_DAY_IN_MONTH
        DAY_IN_MONTH_FX(P_DATE, 1, 0),        --LAST_DAY_IN_MONTH
        DAY_IN_MONTH_FX(P_DATE, 0, -1),       --FIRST_DAY_IN_PREVIOUS_MONTH
        DAY_IN_MONTH_FX(P_DATE, 1, -1),       --LAST_DAY_IN_PREVIOUS_MONTH
        DAY_IN_MONTH_FX(P_DATE, 0, 1),        --FIRST_DAY_IN_NEXT_MONTH
        DAY_IN_MONTH_FX(P_DATE, 1, 1),        --LAST_DAY_IN_NEXT_MONTH
        DAY_IN_QTR_FX(P_DATE, 0, 0, 0),       --FIRST_DAY_IN_CALENDAR_QTR
        DAY_IN_QTR_FX(P_DATE, 1, 0, 0),       --LAST_DAY_IN_CALENDAR_QTR
        DAY_IN_QTR_FX(P_DATE, 0, -1, 0),      --FIRST_DAY_IN_PREV_CALENDAR_QTR
        DAY_IN_QTR_FX(P_DATE, 1, -1, 0),      --LAST_DAY_IN_PREV_CALENDAR_QTR
        DAY_IN_QTR_FX(P_DATE, 0, 1, 0),       --FIRST_DAY_IN_NEXT_CALENDAR_QTR
        DAY_IN_QTR_FX(P_DATE, 1, 1, 0),       --LAST_DAY_IN_NEXT_CALENDAR_QTR
        DAY_IN_YEAR_FX(P_DATE, 0, 0),         --FIRST_DAY_IN_CALENDAR_YEAR
        DAY_IN_YEAR_FX(P_DATE, 1, 0),         --LAST_DAY_IN_CALENDAR_YEAR
        DAY_NUMBER_IN_YEAR_FX(P_DATE, 0),     --DAY_NUMBER_IN_CALENDAR_YEAR
        DAY_IN_QTR_FX(P_DATE, 0, 0, 1),       --FIRST_DAY_IN_FISCAL_QTR
        DAY_IN_QTR_FX(P_DATE, 1, 0, 1),       --LAST_DAY_IN_FISCAL_QTR
        DAY_IN_QTR_FX(P_DATE, 0, -1, 1),      --FIRST_DAY_IN_PREV_FISCAL_QTR
        DAY_IN_QTR_FX(P_DATE, 1, -1, 1),      --LAST_DAY_IN_PREV_FISCAL_QTR
        DAY_IN_QTR_FX(P_DATE, 0, 1, 1),       --FIRST_DAY_IN_NEXT_FISCAL_QTR
        DAY_IN_QTR_FX(P_DATE, 1, 1, 1),       --LAST_DAY_IN_NEXT_FISCAL_QTR
        DAY_IN_YEAR_FX(P_DATE, 0, 1),         --FIRST_DAY_IN_FISCAL_YEAR
        DAY_IN_YEAR_FX(P_DATE, 1, 1),         --LAST_DAY_IN_FISCAL_YEAR
        DAY_NUMBER_IN_YEAR_FX(P_DATE, 1),     --DAY_NUMBER_IN_FISCAL_YEAR
        IS_WEEKDAY_FX(P_DATE),                --IS_WEEKDAY
        IS_WEEKEND_FX(P_DATE),                --IS_WEEKEND
        WEEK_IN_MONTH_FX(P_DATE),             --WEEK_IN_MONTH
        WEEK_IN_YEAR_ISO_FX(P_DATE, 0),       --WEEK_IN_CALENDAR_YEAR_ISO
        WEEK_IN_YEAR_ISO_FX(P_DATE, 1),       --WEEK_IN_FISCAL_YEAR_ISO
        WEEK_POINT_FX(P_DATE, 0, 0),          --BEGIN_FULL_WEEK
        WEEK_POINT_FX(P_DATE, 1, 0),          --END_FULL_WEEK
        WEEK_POINT_FX(P_DATE, 0, 1),          --BEGIN_WORK_WEEK
        WEEK_POINT_FX(P_DATE, 1, 1),          --END_WORK_WEEK
        MONTH_NUMBER_FX(P_DATE),              --MONTH_NUMBER
        MONTH_NAME_FX(P_DATE),                --MONTH_NAME
        MONTH_SHORT_FX(P_DATE),               --MONTH_SHORT
        QUARTER_FX(P_DATE, 0),                --CALENDAR_QUARTER
        QUARTER_NAME_FX(P_DATE, 0),           --CALENDAR_QUARTER_NAME
        QUARTER_YEAR_FX(P_DATE, 0),           --CALENDAR_QUARTER_YEAR
        QUARTER_FX(P_DATE, 1),                --FISCAL_QUARTER
        QUARTER_NAME_FX(P_DATE, 1),           --FISCAL_QUARTER_NAME
        QUARTER_YEAR_FX(P_DATE, 1),           --FISCAL_QUARTER_YEAR
        YEAR_NUMBER_FX(P_DATE, 0),            --CALENDAR_YEAR_NUMBER
        YEAR_FORMAT_FX(P_DATE, 0),            --CALENDAR_YEAR
        YEAR_NUMBER_FX(P_DATE, 1),            --FISCAL_YEAR_NUMBER
        YEAR_FORMAT_FX(P_DATE, 1),            --FISCAL_YEAR
        IS_HOLIDAY_FX(P_DATE),                --IS_HOLIDAY
        IS_BUSINESS_DAY_FX(P_DATE)            --IS_BUSINESSDAY
    );

END NEW_DATE;

ストアド プロシージャにを配置EXECUTE IMMEDIATEする必要があるかどうかはわかりませんが、そうしても現在の問題には何の影響もありませんでした。INSERT INTONEW_DATE

また、私は DBA ではないので、私のコードには無数の間違いがあると確信しています。ただし、エラーを解決し、基本的な手法 (1 つのストアド プロシージャが一連の関数を呼び出す別のストアド プロシージャを呼び出す) を引き続き使用しながらコードを機能させる方法がある場合、それが最終的にいくつかの方法で達成したいことです。支援。

更新 #1INSERT INTO動的 SQLのプロシージャ内のステートメントを カプセル化することで、NEW_DATEいくらか効果があったようです。ただし、次の新しいエラーが発生しました。

  • ORA-00984: ここでは列を使用できません
  • ORA-06512: "ADMIN.NEW_DATE"、5行目
  • ORA-06512: 6行目

これらの新しいエラーは、手順のセクションでP_DATEパラメーターを使用したことが原因である可能性はありますか? もしそうなら、どのようにこれを変更してパラメータを使用できるようにしますか? 次のことを試しましたが、同じエラー メッセージが表示されました ( FULL_DATE 列に注目してください)VALUESNEW_DATE

EXECUTE IMMEDIATE
    'INSERT INTO
     (
         DATE_TYPE,
         FULL_DATE,
         FULL_DATE_REVERSE
     )
     VALUES
     (
         DATE_TYPE_FX(P_DATE),               --DATE_TYPE
         '|| P_DATE ||',                     --FULL_DATE
         FULL_DATE_REVERSE_FX(P_DATE)        --FULL_DATE_REVERSE
     )';

ありがとう

4

2 に答える 2

1

ORA-04068 メッセージは、依存プログラム ユニットが無効化された (コンパイルされていない) ことを示します。これは、特に、そのプログラム単位の依存関係が DDL の対象になっている場合に発生します。

テーブルを削除して再作成する 1 つのプロシージャと、そのテーブルにデータを入力する別のプロシージャがあります。最初のプロシージャを実行すると、その DDL によって 2 番目のプロシージャが無効になります。

しかし、最初のプロシージャーが 2 番目のプロシージャーを呼び出しており、その依存関係が問題の原因です。

おそらく問題の本当の原因は、テーブルを削除して再作成する手順を持っていることです。これが実際に必要な真のケースはほとんどありません。ほとんどの場合、このアプローチは単なる想像力の失敗です。

ただし、この考えに本当に固執している場合は、NEW_DATE 挿入ステートメントも動的 SQL でラップする必要があります。これにより、依存関係ツリーが壊れ、テーブルが削除されたときに無効化が防止されます。


「そのため、INSERT INTO ステートメントを NEW_DATE プロシージャ内の動的 SQL でラップする必要があります」

はい。INSERT は静的 SQL であるため、 NEW_DATE() はコンパイル時に DATE_DIM に依存します。テーブルを削除すると、プロシージャは無効になります。INSERT ステートメントを動的 SQL 呼び出しにすると、依存関係は実行時に移動します。これは、テーブルを削除しても NEW_DATE() が無効にならないことを意味します。実際、テーブルが存在しなくても実行できます。ORA-00904 または同様のエラーが発生するだけです。

では、すべてのプロシージャで動的 SQL を使用して、ORA-04068 メッセージの呪いを追放してみませんか? 動的 SQL を作成するのは、特にデバッグするのが面倒だからです。また、依存関係から一部の値情報が失われるため、データベースの変更の影響分析を行うことが難しくなります。その上、あなたがしていることをして、DDLを繰り返し可能なプログラムプロセスに入れることは、通常は不要です。


「ここで許可されていない列というエラーが表示されるのは、パラメーターが原因だと思いますか?」

絶対。これは文字列リテラルであり、EXECUTE IMMEDIATEは SQL エンジンで文字通り実行します。P_DATEPL/SQL パラメータであり、SQL の範囲外です。

引数を渡したい場合は、正しい構文を使用する必要があります。

EXECUTE IMMEDIATE
    'INSERT INTO
     (
         DATE_TYPE,
         FULL_DATE,
         FULL_DATE_REVERSE
     )
     VALUES
     (
         DATE_TYPE_FX(:1),               --DATE_TYPE
         :2,                     --FULL_DATE
         FULL_DATE_REVERSE_FX(:3)        --FULL_DATE_REVERSE
     )' using p_date, p_date, p_date;

プレースホルダーはそれだけであることに注意してください。27 個の場所で同じ値を使用する場合は、USING 句に 27 個のプレースホルダーと 27 個の一致するオカレンスが必要です。


動的 SQL についてさらに質問がある場合は、最初にドキュメントを参照する必要があると思います。 ここで見つけてください。それでも問題が解決しない場合は、新しいスレッドを開始してください。

于 2013-07-08T21:08:33.780 に答える
0
create or replace 
PROCEDURE DATE_DIM_CREATE
    AUTHID CURRENT_USER
IS
    V_START_DATE DATE := TO_DATE('01/01/1900','MM/DD/YYYY');
    V_CURRENT_DATE  DATE := V_START_DATE;
    V_END_DATE DATE := TO_DATE('12/31/2099','MM/DD/YYYY');
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE "DATE_DIM" PURGE'; <-- <b>you can use if exists function so you dont get an error saying date_dim not found 

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = ''AMERICAN'' ';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY = ''AMERICA'' ';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = ''GREGORIAN'' ';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''MM/DD/YYYY'' ';

    EXECUTE IMMEDIATE
    'CREATE TABLE DATE_DIM
    (
        DATE_KEY NUMBER(8, 0) NOT NULL,  
        DATE_TYPE VARCHAR2(14),
        FULL_DATE DATE,
        FULL_DATE_REVERSE VARCHAR2(10),
        FULL_DATE_DESCRIPTION VARCHAR2(31),
        DAY_NUMBER NUMBER(2, 0),
        DAY_NAME VARCHAR2(9),
        DAY_SHORT VARCHAR2(3),
        FIRST_DAY_IN_MONTH DATE,
        LAST_DAY_IN_MONTH DATE,
        FIRST_DAY_IN_PREVIOUS_MONTH DATE,
        LAST_DAY_IN_PREVIOUS_MONTH DATE,
        FIRST_DAY_IN_NEXT_MONTH DATE,
        LAST_DAY_IN_NEXT_MONTH DATE,
        FIRST_DAY_IN_CALENDAR_QTR DATE,
        LAST_DAY_IN_CALENDAR_QTR DATE,
        FIRST_DAY_IN_PREV_CALENDAR_QTR DATE,
        LAST_DAY_IN_PREV_CALENDAR_QTR DATE,
        FIRST_DAY_IN_NEXT_CALENDAR_QTR DATE,
        LAST_DAY_IN_NEXT_CALENDAR_QTR DATE,
        FIRST_DAY_IN_CALENDAR_YEAR DATE,
        LAST_DAY_IN_CALENDAR_YEAR DATE,
        DAY_NUMBER_IN_CALENDAR_YEAR NUMBER(3, 0),
        FIRST_DAY_IN_FISCAL_QTR DATE,
        LAST_DAY_IN_FISCAL_QTR DATE,
        FIRST_DAY_IN_PREV_FISCAL_QTR DATE,
        LAST_DAY_IN_PREV_FISCAL_QTR DATE,
        FIRST_DAY_IN_NEXT_FISCAL_QTR DATE,
        LAST_DAY_IN_NEXT_FISCAL_QTR DATE,
        FIRST_DAY_IN_FISCAL_YEAR DATE,  
        LAST_DAY_IN_FISCAL_YEAR DATE,
        DAY_NUMBER_IN_FISCAL_YEAR NUMBER(3, 0),
        IS_WEEKDAY VARCHAR2(1),
        IS_WEEKEND VARCHAR2(1), 
        WEEK_IN_MONTH NUMBER(1, 0),
        WEEK_IN_CALENDAR_YEAR_ISO NUMBER(2, 0),
        WEEK_IN_FISCAL_YEAR_ISO NUMBER(2, 0),
        BEGIN_FULL_WEEK DATE,
        END_FULL_WEEK DATE,
        BEGIN_WORK_WEEK DATE,
        END_WORK_WEEK DATE,
        MONTH_NUMBER NUMBER(2, 0),
        MONTH_NAME VARCHAR(9),
        MONTH_SHORT VARCHAR(3),
        CALENDAR_QUARTER NUMBER(1, 0),
        CALENDAR_QUARTER_NAME VARCHAR2(11),
        CALENDAR_QUARTER_YEAR VARCHAR2(9),
        FISCAL_QUARTER NUMBER(1, 0),
        FISCAL_QUARTER_NAME VARCHAR2(11),
        FISCAL_QUARTER_YEAR VARCHAR2(9),
        CALENDAR_YEAR_NUMBER NUMBER(4, 0),
        CALENDAR_YEAR VARCHAR2(6),
        FISCAL_YEAR_NUMBER NUMBER(4, 0),
        FISCAL_YEAR VARCHAR2(6),
        IS_HOLIDAY VARCHAR2(1),
        IS_BUSINESS_DAY VARCHAR2(1),
        CONSTRAINT DATE_KEY_PK PRIMARY KEY (DATE_KEY)
    )

/
COMMENT ON TABLE DATE_DIM
IS ''日付属性の格納に使用される日付ディメンション テーブル。''
/
COMMENT ON COLUMN DATE_DIM.DATE_KEY
IS ''日付キーは、日付ディメンション テーブルのプライマリ/サロゲート キーです。'' ';

WHILE V_CURRENT_DATE <= V_END_DATE LOOP
    NEW_DATE(V_CURRENT_DATE);
    V_CURRENT_DATE := V_CURRENT_DATE + INTERVAL '1' DAY;
END LOOP;

これがあなたがすべきことです..プロシージャ
exec NEW_DATEを呼び出す必要があります。
NEW_DATE(TO_DATE('12/29/9999', 'MM/DD/YYYY'));
NEW_DATE(TO_DATE('12/30/9999', 'MM/DD/YYYY'));
NEW_DATE(TO_DATE('12/31/9999', 'MM/DD/YYYY'));

END DATE_DIM_CREATE;<br/>


現時点ではplsqlをチェックしていませんが、問題はプロシージャを正しい方法で呼び出していないことです。方法は、exec NEW_DATE\e です。create table で何かを修正したことに言及する必要があります。 create table にコメントを含めることができます

于 2013-07-08T19:47:27.797 に答える