PL / SQL脚本datamart时间表错误

时间:2016-06-14 18:54:12

标签: oracle date

我使用此脚本在oracle 11g express上的数据仓库上生成时间表。这是表

enter image description here

但是当我编译时,它给了我这个错误: this error

以下脚本用于生成时间维度。我记得一年前使用相同的代码,但现在它给了我提到的错误:

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]

谢谢

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的列。