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;
/
您確定沒有更多的錯誤嗎?你有一個永遠不會聲明的變量'v_current_date'。這應該是你得到的第一個錯誤。我無法想象你想用兩個參數聲明兩個局部變量'v_start_date'和'v_end_date',雖然這不會產生編譯錯誤,但這意味着你的代碼幾乎肯定不會做你想做的事。在'to_date'調用中缺少格式掩碼也可能會產生問題。 – 2015-02-18 00:33:36
一旦我運行腳本,就會看到「警告:編譯錯誤時創建的過程」。然後我輸入「顯示錯誤」命令。我正在使用Oracle XE 11g,並從SQL Plus命令行添加路徑@C:\ script.sql來運行腳本。 – NewComer 2015-02-18 00:41:18
INSERT語句中的列列表後面有一個虛假的逗號。 – 2015-02-18 03:33:09