2015-02-18 52 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; 
/