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