2015-02-18 47 views
0

我試圖創建一個需要兩個參數但存在錯誤的存儲過程。這兩個參數都是年,即(2011,2013)。現在我有一個表格,其中一個字段名爲DATE_DESCRIPTION,我希望在2011年1月1日至2013年12月31日之間插入所有日期。在Oracle Express中的PL/SQL存儲過程 - 錯誤

這樣當我選擇DATE_DESCRIPTION FROM TABLE時,我的結果應該看起來像作爲「2012年4月13日星期四」一行的示例。這應該是兩個參數之間的所有日子。

最終,我想爲每一天添加一個名爲DKEY的主鍵,但我想我可以從此開始並在此基礎上構建。

這裏是我的腳本:

CREATE OR REPLACE PROCEDURE sp_DATE_TABLE (v_START_YEAR IN INT, v_END_YEAR IN INT) AS 

v_START_DATE DATE; 
v_END_DATE DATE; 

BEGIN 

DELETE FROM DATE_DIMENSION; 

v_CURRENT_DATE := TO_DATE('1-JAN-' || v_START_YEAR); 
v_END_DATE := TO_DATE('31-DEC-' || v_END_YEAR); 

WHILE v_CURRENT_DATE <= v_END_DATE 
LOOP 

    INSERT INTO DATE_DIMENSION(FULL_DATE_DESCRIPTION), 
    VALUES(TO_CHAR(v_CURRENT_DATE, 'Day, Month DDth, YYYY')); 

    v_CURRENT_DATE := v_CURRENT_DATE + 1; 
END LOOP; 
END; 
/

錯誤

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
15/2  PL/SQL: SQL Statement ignored 
15/53 PL/SQL: ORA-00926: missing VALUES keyword 


修改代碼和解決方案:

CREATE OR REPLACE PROCEDURE sp_DATE_D(v_START_YEAR IN INT, v_END_YEAR IN INT) AS 

v_CURRENT_DATE DATE; 
v_END_DATE DATE; 

BEGIN 

v_CURRENT_DATE := TO_DATE('0101' || v_START_YEAR, 'MMDDYYYY'); 
v_END_DATE  := TO_DATE('1231' || v_END_YEAR, 'MMDDYYYY'); 

DELETE FROM DATE_D; 

WHILE v_CURRENT_DATE <= v_END_DATE 
LOOP 
INSERT INTO DATE_D 
(
    DATE_KEY, 
    FULL_DATE_DESCRIPTION 

) 
VALUES 
(
    v_CURRENT_DATE, 
    TO_CHAR(v_CURRENT_DATE, 'Day, Month DD, YYYY'), 

); 

v_CURRENT_DATE := v_CURRENT_DATE + 1; 

END LOOP; 
END; 
/
+1

您確定沒有更多的錯誤嗎?你有一個永遠不會聲明的變量'v_current_date'。這應該是你得到的第一個錯誤。我無法想象你想用兩個參數聲明兩個局部變量'v_start_date'和'v_end_date',雖然這不會產生編譯錯誤,但這意味着你的代碼幾乎肯定不會做你想做的事。在'to_date'調用中缺少格式掩碼也可能會產生問題。 – 2015-02-18 00:33:36

+0

一旦我運行腳本,就會看到「警告:編譯錯誤時創建的過程」。然後我輸入「顯示錯誤」命令。我正在使用Oracle XE 11g,並從SQL Plus命令行添加路徑@C:\ script.sql來運行腳本。 – NewComer 2015-02-18 00:41:18

+3

INSERT語句中的列列表後面有一個虛假的逗號。 – 2015-02-18 03:33:09

回答

0

我已經重新編寫的,沒有錯誤編譯的代碼它完全符合我的要求。接受了@JustinCave的建議並進行了修改。

CREATE OR REPLACE PROCEDURE sp_DATE_D(v_START_YEAR IN INT, v_END_YEAR IN INT) AS 

v_CURRENT_DATE DATE; 
v_END_DATE DATE; 

BEGIN 

v_CURRENT_DATE := TO_DATE('0101' || v_START_YEAR, 'MMDDYYYY'); 
v_END_DATE  := TO_DATE('1231' || v_END_YEAR, 'MMDDYYYY'); 

DELETE FROM DATE_DIMENSION; 

WHILE v_CURRENT_DATE <= v_END_DATE 
LOOP 
INSERT INTO DATE_DIMENSION 
(
DATE_KEY, 
FULL_DATE_DESCRIPTION, 
) 
VALUES 
(
    v_CURRENT_DATE, 
    TO_CHAR(v_CURRENT_DATE, 'Day, Month DD, YYYY'), 

); 

v_CURRENT_DATE := v_CURRENT_DATE + 1; 

END LOOP; 
END; 
/