PL/SQL Oracle Express 中的存储过程 - 错误
PL/SQL Stored Procedure IN Oracle Express - Error
我正在尝试创建一个带有两个参数的存储过程,但我收到了一个错误。这两个参数都是年份,即 (2011, 2013)。现在我有一个 table 和一个名为 DATE_DESCRIPTION 的字段,我想在其中插入从 2011 年 1 月 1 日到 2013 年 12 月 31 日之间的所有日期。
这样当我从 TABLE SELECT DATE_DESCRIPTION 时,我的结果应该看起来像一行 "Thursday, April 13th, 2012" 的例子。这应该适用于两个参数之间的所有日期。
最后我还想为每一天添加一个名为 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;
/
我重写了编译时没有错误的代码,它完全符合我的要求。听取了@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;
/
我正在尝试创建一个带有两个参数的存储过程,但我收到了一个错误。这两个参数都是年份,即 (2011, 2013)。现在我有一个 table 和一个名为 DATE_DESCRIPTION 的字段,我想在其中插入从 2011 年 1 月 1 日到 2013 年 12 月 31 日之间的所有日期。
这样当我从 TABLE SELECT DATE_DESCRIPTION 时,我的结果应该看起来像一行 "Thursday, April 13th, 2012" 的例子。这应该适用于两个参数之间的所有日期。
最后我还想为每一天添加一个名为 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;
/
我重写了编译时没有错误的代码,它完全符合我的要求。听取了@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;
/