2016-11-04 5 views
2

Keep両方のコードで同じエラーが表示されます。エラー:PL/SQL:コンパイル単位の分析が終了しましたか?

DROP TABLE Date_Dimension CASCADE CONSTRAINTS ; 

CREATE TABLE Date_Dimension 
    (
    date_key    NUMBER NOT NULL , 
    full_date   DATE , 
    day_of_week   NUMBER , 
    day_num_in_month  NUMBER , 
    day_num_overall  NUMBER , 
    day_name    VARCHAR2 (9) , 
    day_abbrev   VARCHAR2 (3) , 
    week_num_in_year  NUMBER , 
    week_num_overall  NUMBER , 
    week_begin_date  DATE , 
    MONTH    NUMBER , 
    month_number_overall NUMBER , 
    month_name   VARCHAR2 (9) , 
    month_abbrev   VARCHAR2 (3) , 
    quarter    NUMBER , 
    YEAR     VARCHAR2 (20) , 
    century    NUMBER 
) ; 
ALTER TABLE Date_Dimension ADD CONSTRAINT Date_Dimension_PK PRIMARY KEY (date_key) ; 

Create or replace PROCEDURE sp_DATE_DIMENSION(v_STARTDATE IN INT, v_END_YEAR IN INT) IS 

v_STARTDATE DATE; 
v_ENDDATE DATE; 

v_STARTDATE Date := to_date('2005/01/01' || v_START_YEAR, 'YYYY/MM/DD'); 
v_ENDDATE Date := to_date('2020/12/31' || v_END_YEAR,'YYYY/MM/DD'); 

BEGIN 

INSERT INTO 

    Date_Dimension 
    (date_key,full_date, day_of_week, day_num_in_month, day_num_overall, day_name, day_abbrev, week_num_in_year, week_num_overall, month, month_name, month_abbrev, quarter, year, century) 

VALUES 
    (
'1',TO_DATE(v_STARTDATE, 'yyyy/mm/dd'), TO_NUMBER(v_STARTDATE, 'D'), TO_NUMBER(v_STARTDATE, 'DD'), TO_NUMBER(v_STARTDATE, 'DDD'), TO_CHAR(v_STARTDATE, 'DAY'), TO_CHAR(v_STARDATE, 'DY'), TO_NUMBER(v_STARTDATE, 'IW'), TO_NUMBER(v_STARTDATE, 'WW'), TO_NUMBER(v_STARTDATE, 'MM'), TO_CHAR (v_STARTDATE, 'MONTH'), TO_CHAR (v_STARTDATE, 'MON'), TO_NUMBER (v_STARTDATE, 'Q'), TO_CHAR (v_STARTDATE, 'YEAR'), TO_NUMBER (v_STARTDATE, 'CC') 
) 
; 

IF v_STARTDATE > v_ENDDATE THEN 

    DBMS_OUTPUT.PUT_LINE ('ERROR IN CODE REGARDING DATES CHOSEN'); 

ELSE 

    WHILE v_STARTDATE <= V_ENDDATE LOOP 
     DBMS_OUTPUT.PUT_LINE ('Date : '||to_char(v_StartDate,'YYYY/MM/DD')); 

     v_STARTDATE := v_STARTDATE + 1; 

    END LOOP; 
END IF; 
END; 
+1

エラーとは何ですか?それは表示されますか? – Dmitry

+0

あなたはどのクライアントを使用していますか?最初の終了メッセージを超えて、おそらくIDEの別のウィンドウやセクションで、またはSQL \ * Plusのようなものを介して、エラー ';または' user_errors'を問い合わせることによるフォールバックとして、格納されているすべてのPL/SQLコードに対して未処理のエラーをすべて保持します。 –

+0

Oracle SQL Developerはエラー・メッセージを返します。エラーの場所を正確に確認することはできません。 – Coder101

答えて

1

あなたのコードでは、あなたはローカル変数としてプロシージャの書式引数リストから名前startdateを重複している

PLS-00410: duplicate fields in RECORD,TABLE or argument list are not permitted

取得します。それらの両方を再度繰り返す。それは数字なので、ちょうど今年の正式な議論を意味すると思います。

to_date('2005/01/01' || v_START_YEAR, 'YYYY/MM/DD') 

...あなたはすでに2005年にハードコードされているので、意味がありません。

create or replace PROCEDURE sp_DATE_DIMENSION(p_START_YEAR IN NUMBER, p_END_YEAR IN NUMBER) IS 
    l_START_DATE Date := to_date(p_START_YEAR ||'-01-01', 'YYYY-MM-DD'); 
    l_END_DATE Date := to_date(p_END_YEAR ||'-01-01', 'YYYY-MM-DD'); 
BEGIN 

と一致するように微調整他の変数の参照を持つ:

は、私はあなたがより多くのような何かをしたい、その部分のためだと思います。あなたの挿入では、数値1の代わりに文字列'1'として最初の値を渡しています。すでに日付が設定されている変数に対してto_date()を呼び出します。 to_number()に日付要素の書式マスクを指定します。文字列に変換する必要がある場合は文字列に、次に数値に変換します。だから、インサートは、より多くのようになりwoudl:

INSERT INTO Date_Dimension (date_key, full_date, day_of_week, day_num_in_month, 
    day_num_overall, day_name, day_abbrev, week_num_in_year, week_num_overall, 
    month, month_name, month_abbrev, quarter, year, century) 
    VALUES (1, 
    l_START_DATE, 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'D')), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'DD')), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'DDD')), 
    TO_CHAR(l_START_DATE, 'DAY'), 
    TO_CHAR(l_START_DATE, 'DY'), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'IW')), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'WW')), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'MM')), 
    TO_CHAR(l_START_DATE, 'MONTH'), 
    TO_CHAR(l_START_DATE, 'MON'), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'Q')), 
    TO_CHAR (l_START_DATE, 'YEAR'), 
    TO_NUMBER(TO_CHAR(l_START_DATE, 'CC')) 
); 

それも、(a)で呼び出し元のプログラムは、何かが間違っていることは他の兆候を持っていないとして、エラー・メッセージにdbms_outputを使用することをお勧めではないと、(b)単純なクライアントコールでは、ユーザは、有効にされたもののキャプチャまたは表示さえしていなくてもよい。例外は、日付が間違っている場合には、とにかく達するを超えてあなたは何としてelse一部を必要としないので、手順は、早期に終了します

IF l_START_DATE > l_END_DATE THEN 
    RAISE_APPLICATION_ERROR (-20001, 'ERROR IN CODE REGARDING DATES CHOSEN'); 
    END IF; 

    WHILE l_START_DATE <= l_END_DATE LOOP 
    DBMS_OUTPUT.PUT_LINE ('Date : ' || to_char(l_START_DATE, 'YYYY/MM/DD')); 
    l_START_DATE := l_START_DATE + 1; 
    END LOOP; 
END; 
/

:それは例外をスローする方が良いでしょう。

でも、実際にはループの内側に挿入してすべての関連する行を作成する必要があります。それはチェックと例外を最初から実行するのが理にかなっています(日付ではなく年を比較しても大した問題ではないかもしれませんが、おそらく私が忘れてしまったこともあります。通常のSQLと1つの挿入で実行できるので、これはPL/SQLのプロシージャを必要としませんが、これは練習問題です。

関連する問題