我使用此脚本在oracle 11g express上的数据仓库上生成时间表。这是表
以下脚本用于生成时间维度。我记得一年前使用相同的代码,但现在它给了我提到的错误:
CREATE or replace procedure date_manag is
date_debut DATE;
date_loop DATE;
date_fin DATE;
jour BINARY_INTEGER;
mois BINARY_INTEGER;
annee BINARY_INTEGER;
trim BINARY_INTEGER;
nom Varchar2(20);
Begin
date_debut:=TO_DATE('20/01/2012','dd/mm/yyyy');
date_fin:=TO_DATE('20/12/2012','dd/mm/yyyy');
date_loop:=date_debut;
WHILE date_loop <=date_fin
LOOP
select extract(day from date_loop) into jour from dual;
select extract(month from date_loop) into mois from dual;
select extract(year from date_loop) into annee from dual;
CASE
WHEN mois=1 THEN nom :='JANVIER';
WHEN mois=2 THEN nom :='FEVRIER';
WHEN mois=3 THEN nom :='MARS';
WHEN mois=4 THEN nom :='AVRIL';
WHEN mois=5 THEN nom :='MAI';
WHEN mois=6 THEN nom :='JUIN';
WHEN mois=7 THEN nom :='JUILLET';
WHEN mois=8 THEN nom :='AOUT';
WHEN mois=9 THEN nom :='SEPTEMBRE';
WHEN mois=10 THEN nom :='OCTOBRE';
WHEN mois=11 THEN nom :='NOVEMBRE';
else nom:='DECEMBRE';
END CASE;
CASE
when mois in(1,2,3) THEN trim :=1;
when mois in(4,5,6) THEN trim :=2;
when mois in(7,8,9) THEN trim :=3;
else trim:=4;
END CASE;
INSERT into QOS.TEMPS VALUES( CASE
when mois in(10,11,12) THEN annee||jour||mois
ELSE annee||jour||'0'||mois
END
,annee,mois,jour,trim,jour || '/' || mois || '/' || annee,nom);
select ADD_MONTHS(date_loop,1) into date_loop from dual;
END LOOP;
END;
/
[this is my table][2]
谢谢
答案 0 :(得分:0)
INSERT
语句中的值与表中的列的顺序不同。最好不要依赖列的顺序,你应该明确列出列。
INSERT into QOS.TEMPS (ID_DATE, ANNEE, MOIS, JOUR, TRIMESTRE, DATETIME, NOM)
VALUES( CASE
WHEN mois > 9 THEN annee||jour||mois
ELSE annee||jour||'0'||mois
END
,annee,mois,jour,trim,jour || '/' || mois || '/' || annee,nom);
答案 1 :(得分:0)
你的SQL
select extract(year from date_loop) into annee from dual;
返回year的整数值,这是一个期待DATE的列。