我目前正在尝试在APEX上填充日期表,日期从“2017-01-01”到“2025-12- 31”。我已经使用以下命令创建了表和列:
CREATE TABLE CALENDAR_TBL (
"DATE_ROWID" NUMBER NOT NULL ENABLE,
"DATE" DATE,
"DAY_NUMBER" NUMBER,
"MONTH_NUMBER" NUMBER,
"MONTH_NAME" VARCHAR2(20),
"YEAR" NUMBER,
"YEAR_MONTH_NUMBER" NUMBER,
"YEAR_MONTH_NAME" VARCHAR2(20),
"DAY_NAME" VARCHAR2(20),
CONSTRAINT "DATE_ROWID_PK" PRIMARY KEY ("DATE_ROWID")
USING INDEX ENABLE
)
/
我创建了一个触发器和一个序列,以便在每次添加一行时填充DATE_ROWID
列。
我写了这个脚本来填充表格:
DECLARE
start_date DATE := TO_DATE('2017-01-01','YYYY-MM-DD');
end_date DATE := TO_DATE('2050-12-31','YYYY-MM-DD');
current_date DATE := start_date;
BEGIN
WHILE current_date <= end_date LOOP
INSERT INTO CALENDAR_TBL (DATE, DAY_NUMBER, MONTH_NUMBER, MONTH_NAME, YEAR, YEAR_MONTH_NUMBER, YEAR_MONTH_NAME, DAY_NAME)
VALUES (
current_date,
TO_NUMBER(TO_CHAR(current_date, 'DD')),
TO_NUMBER(TO_CHAR(current_date, 'MM')),
TO_CHAR(current_date, 'MONTH'),
TO_NUMBER(TO_CHAR(current_date, 'YYYY')),
TO_NUMBER(TO_CHAR(current_date, 'YYYYMM')),
TO_CHAR(current_date, 'YYYY MONTH'),
TO_CHAR(current_date, 'DAY')
);
current_date := current_date + 1;
END LOOP;
END;
但是当我运行它时,我得到了错误:
ORA-06550: line 7, column 39:
PL/SQL: ORA-00928: missing SELECT keyword
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_210200", line 673
ORA-06550: line 7, column 5:
PL/SQL: SQL Statement ignored
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1658
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_210200", line 659
ORA-06512: at "APEX_210200.WWV_FLOW_DYNAMIC_EXEC", line 1829
5. BEGIN
6. WHILE current_date <= end_date LOOP
7. INSERT INTO CALENDAR_TBL (DATE, DAY_NUMBER, MONTH_NUMBER, MONTH_NAME, YEAR, YEAR_MONTH_NUMBER, YEAR_MONTH_NAME, DAY_NAME)
8. VALUES (
9. current_date,
我真的不明白我的程序哪里出错了...
非常感谢你的帮助。
2条答案
按热度按时间b09cbbtk1#
在
CALENDAR_TBL
中使用虚拟列,这样就不会出现DATE
和其他列不同步的情况(主键为IDENTITY
列):DATE
是一个保留字,您需要使用带引号的标识符才能使用它。最好使用其他标识符。*然后,您可以使用插入:
fiddle
x7rlezfr2#
我会使用一个单一的插入选择,如下所示: