PL/SQL Oracle Application Express 中的存储过程不是 运行

PL/SQL Stored Procedure in Oracle Application Express not running

我创建了编译没有错误的存储过程。但是当我 运行 exec sp_DATE_D(2005, 2006); 我收到以下错误:

第 1 行的错误:
ORA-01858: 在需要数字的地方发现了非数字字符
ORA-06512: 在 "SP_DATE_D",第 14 行
ORA-06512: 在第 1 行

我希望我的示例数据看起来像这样作为一行的示例:
DATE_KEY:2005 年 1 月 1 日
FULL_DATE_DESCRIPTION:2005 年 1 月 1 日,星期一

该过程应该从此时开始填充,直到第二个参数的最后一天。


存储过程:

CREATE OR REPLACE PROCEDURE sp_DATE_DD(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
(
    TO_DATE(v_CURRENT_DATE, 'MMDDYYYY'),
    TO_CHAR(v_CURRENT_DATE, 'Day, Month DD, YYYY')
);
v_CURRENT_DATE := v_CURRENT_DATE + 1;

END LOOP;
END;
/

Table定义:

CREATE TABLE DATE_D
(  
    DATE_KEY DATE NOT NULL,
    FULL_DATE_DESCRIPTION VARCHAR2(64) NOT NULL,
    CONSTRAINT DATE_DIMENSION_PK PRIMARY KEY (DATE_KEY)
);

添加: 不知道是格式问题还是我应该转换。


解法:

修改第 22 行 -

v_CURRENT_DATE,

问题似乎出在这一行:

TO_DATE(v_CURRENT_DATE, 'MMDDYYYY'),

v_CURRENT_DATE 已经是 DATE 变量。要将其传递给 TO_DATE 函数,Oracle 必须将其转换为字符串,日期的默认字符串格式为 DD-MON-RR。因此,如果 v_CURRENT_DATE 已经包含 1-JAN-2005,则会将其转换为字符串“01-JAN-05”,然后传递给 TO_DATE。但是传递给 TO_DATE 的格式参数是 'MMDDYYYY',它与传递给它的字符串 ('01-JAN-05') 不匹配,因此 TO_DATE 函数失败。

解决方案相当简单:因为 v_CURRENT_DATE 已经是一个 DATE 变量,所以根本不需要调用 TO_DATE。将 INSERT 语句更改为:

INSERT INTO DATE_D
(
    DATE_KEY, 
    FULL_DATE_DESCRIPTION
)   
VALUES
(
    v_CURRENT_DATE,
    TO_CHAR(v_CURRENT_DATE, 'Day, Month DD, YYYY')
);