Stored procedures Oracle Express中的PL/SQL存储过程-错误

Stored procedures Oracle Express中的PL/SQL存储过程-错误,stored-procedures,plsql,oracle11g,Stored Procedures,Plsql,Oracle11g,我试图创建一个包含两个参数的存储过程,但收到一个错误。这两个参数都是一年,即(2011年、2013年)。现在我有一个表,其中有一个名为DATE_DESCRIPTION的字段,我想在其中插入2011年1月1日到2013年12月31日之间的所有日期 这样,当我从表中选择DATE_DESCRIPTION时,我的结果应该类似于一行“2012年4月13日星期四”的示例。这应适用于两个参数之间的所有天数 最后,我还想为每天添加一个名为DKEY的主键,但我想我可以从这个开始并在此基础上进行构建 这是我的剧本:

我试图创建一个包含两个参数的存储过程,但收到一个错误。这两个参数都是一年,即(2011年、2013年)。现在我有一个表,其中有一个名为DATE_DESCRIPTION的字段,我想在其中插入2011年1月1日到2013年12月31日之间的所有日期

这样,当我从表中选择DATE_DESCRIPTION时,我的结果应该类似于一行“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;
/

修改的代码和解决方案:

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;
/
创建或替换过程sp_DATE_D(v_START_YEAR IN INT,v_END_YEAR IN INT)作为
当前日期;
结束日期;
开始
v_当前日期:=截止日期(“0101”v|u开始日期“MMDDYYYY”);
结束日期:=截止日期('1231'|结束年份,'MMDDYYYY');
从日期中删除;

当v_CURRENT_DATE时,我重新编写了编译时没有错误的代码,它完全符合我的要求。听取了@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;
/
创建或替换过程sp_DATE_D(v_START_YEAR IN INT,v_END_YEAR IN INT)作为
当前日期;
结束日期;
开始
v_当前日期:=截止日期(“0101”v|u开始日期“MMDDYYYY”);
结束日期:=截止日期('1231'|结束年份,'MMDDYYYY');
从日期维度删除;

当v_当前日期时,您确定没有更多错误吗?您有一个从未声明的变量
v\u current\u date
。这应该是您遇到的第一个错误。我无法想象您想要声明两个局部变量
v_start_date
v_end_date
,并使用与这两个参数相同的名称,尽管这不会产生编译错误,但这意味着您的代码几乎肯定不会执行您想要的操作。在您的
to_date
调用中缺少格式掩码也可能会有问题。一旦运行脚本,我就会收到“警告:创建的过程存在编译错误”。然后我键入“showererror”命令。我使用的是Oracle XE 11g,在SQL Plus命令行中,我只添加了路径@C:\script.SQL来运行脚本。INSERT语句中的列列表后面有一个虚假的逗号。Post已使用正确的解决方案进行了更新。
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;
/