【问题标题】:Filling Time_Dimension?填充时间_维度?
【发布时间】:2013-09-01 02:39:35
【问题描述】:

我写了这个脚本,但它不起作用。我没有收到任何错误消息,它只是挂起,您能帮帮我吗?

DECLARE
    vYear_ID VARCHAR(4);
    vQuarter CHARACTER(6);
    vMonth_Num SMALLINT;
    vMonth_Name VARCHAR(20);
    vWeekday_Num SMALLINT;
    vWeekday_Name VARCHAR(20); 
    vStartDate Date := '01/01/1998';
    vEndDate Date := '31/12/2002';
    vDate_ID Date;
    vDate_ID := vStartDate;

BEGIN

    WHILE vDate_ID < vEndDate 
    LOOP
        vYear_ID := TO_CHAR(vDate_ID,'YYYY');
        vQuarter := TO_CHAR(vDate_ID,'YYYY')||'Q'||TO_CHAR(vDate_ID,'Q');
        vMonth_Num := TO_NUMBER(TO_CHAR(vDate_ID,'MM'));
        vMonth_Name := TO_CHAR(vDate_ID,'Month');
        vWeekday_Num := TO_NUMBER(TRIM(leading '0' FROM TO_CHAR(vDate_ID,'D')));
        vWeekday_Name := TO_CHAR(vDate_ID,'Day');

        INSERT INTO Time_Dim VALUES (vDate_ID, vYear_ID, vQuarter, vMonth_Name, vWeekday_Name, vMonth_Num, );

        vDate_ID = to_date(vDate_ID,'DD/MM/YYYY')+1

    END LOOP;

END;

我必须使用 While 循环而不是 For。

提前致谢。

【问题讨论】:

  • “不起作用”并不是特别有用。你有错误吗?如果是这样,什么错误?
  • 你有一个尾随逗号 - " vMonth_Num, );"顺便说一句,您的声誉 > 1,所以我希望您知道如何提出正确的问题。
  • 要跟进 OldProgrammer 的评论,请在发布有错误的问题时至少包含错误消息。在 Oracle 中,错误会告诉您行号,并且应该很容易识别结尾的逗号和缺少的分号 vDate_ID = to_date(vDate_ID,'DD/MM/YYYY')+1。请在提出问题之前尝试自己解决此问题。
  • 我没有收到任何错误信息,它只是挂在那里,这就是为什么我没有在我的问题中包含任何信息,很抱歉给您带来不便。

标签: sql oracle calendar etl business-intelligence


【解决方案1】:

这并没有解决确切的问题。但由于实际问题是一个沉闷的“猜测编译错误”,我选择回答一个更有趣的问题:)

INSERT INTO Time_Dim VALUES 
    (vDate_ID, vYear_ID, vQuarter, vMonth_Name, vMonth_Num, vWeekday_Name, vWeekday_Num)
with dt as ( select date '1998-01-01' as start_dt
                    , date '2002-12-31' as end_dt 
             from dual )
     , ths as ( select start_dt + ( level - 1) as id_date
                from dt
                connect by level <= ( end_dt - start_dt ) + 1
              )
select id_date
       , to_char(id_date, 'YYYY')
       , trim(to_char(id_date, 'YYYY'))||'Q'||to_char(id_date, 'Q')
       , to_char(id_date, 'Month')
       , to_number(to_char(id_date, 'MM'))
       , to_char(id_date, 'Day')
       , to_number(to_char(id_date, 'D'))
from ths;

这里是a SQL Fiddle for the SELECT part of the statement

【讨论】:

  • 非常感谢 APC 大人 :),你是救命稻草,我不擅长 PL/SQL,但这个可以帮我,再次感谢 ^^。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多