Oracle PL/SQL日期\数据的维度填充-数据仓库

Oracle PL/SQL日期\数据的维度填充-数据仓库,oracle,plsql,Oracle,Plsql,可以使用pl/sql中的一些指导,使用存储过程将数据添加到Oracle中的表中。目前正在使用Oraclexe11g。我的存储过程目前看起来非常赤裸,希望得到一些帮助。这是我的存储过程(sp_DATE_DIMENSION),它接受两个参数和我已经创建的DATE_DIMENSION表的定义 CREATE OR REPLACE PROCEDURE sp_DATE_DIMENSION(v_START_YEAR IN INT, v_END_YEAR IN INT) AS DECLARE v_CURRE

可以使用pl/sql中的一些指导,使用存储过程将数据添加到Oracle中的表中。目前正在使用Oraclexe11g。我的存储过程目前看起来非常赤裸,希望得到一些帮助。这是我的存储过程(sp_DATE_DIMENSION),它接受两个参数和我已经创建的DATE_DIMENSION表的定义

CREATE OR REPLACE PROCEDURE sp_DATE_DIMENSION(v_START_YEAR IN INT, v_END_YEAR IN INT) AS


DECLARE
v_CURRENT_DATE;
v_FULL_DATE_DESCRIPTION VARCHAR;

BEGIN 

DELETE FROM DATE_DIMENSION;

WHILE v_CURRENT_DATE <= v_END_DATE
LOOP 

/

CREATE TABLE DATE_DIMENSION
(  
DATE_KEY DATE NOT NULL,
FULL_DATE_DESCRIPTION VARCHAR2(64) NOT NULL,
DAY_OF_WEEK NUMBER(1,0) NOT NULL,
DAY_OF_MONTH NUMBER(2,0) NOT NULL,
DAY_OF_YEAR NUMBER(3,0) NOT NULL,
LAST_DAY_OF_WEEK_INDICATOR CHAR(1) NOT NULL,
LAST_DAY_OF_MONTH_INDICATOR CHAR(1) NOT NULL,
WEEK_ENDING_DATE DATE NOT NULL,
MONTH_NUMBER NUMBER(2,0) NOT NULL,
MONTH_NAME VARCHAR2(32) NOT NULL,
YEAR_MONTH CHAR(32) NOT NULL,
QUARTER_NUMBER NUMBER(1,0) NOT NULL,
YEAR_QUARTER CHAR(32) NOT NULL,
YEAR_NUMBER NUMBER(4,0) NOT NULL,
CONSTRAINT DATE_DIMENSION_PK PRIMARY KEY (DATE_KEY)
)
创建或替换过程sp_DATE_维度(v_START_YEAR IN INT,v_END_YEAR IN INT)作为
声明
当前日期;
v_完整_日期_描述VARCHAR;
开始
从日期维度删除;

虽然v_CURRENT_DATE好的,我想我明白了。您希望为数据仓库填充一个日期表,其中包含日期的所有方面,以便在仓库中进行更方便/更快的查询。我是这样做的:

CREATE OR REPLACE PROCEDURE sp_DATE_DIMENSION (v_START_YEAR IN INT, v_END_YEAR IN INT) AS
  l_start_date DATE;
  l_end_date DATE;

BEGIN
  l_current_date = to_date('1-JAN-' || v_start_year);
  l_end_date = to_date('31-DEC-' || v_end_year);

  WHILE l_current_date <= l_end_date LOOP

    INSERT INTO date_dimension VALUES (
      l_current_date, 
      to_char(l_current_date, 'Day, Month DDth, YYYY'),
      ...  for each column, use to_char and the proper format mask ...  
    );

    l_current_date := l_current_date + 1;
  END LOOP;
END;
创建或替换过程sp_DATE_维度(v_START_YEAR IN INT,v_END_YEAR IN INT)作为
l_开始日期;
l_结束日期;
开始
l|u当前|u日期=截止日期(“1-1-1-”| v|u开始|u年);
l|u end|u date=截止日期(“12月31日-”| v|u end|u year);

经过一段时间的阅读和来自Fellow Stackers的帮助,我能够完成我最初发布的内容。因此,下面的存储过程再次更详细地获取两个输入参数,即(2001、2005),并以不同的格式填充从开始年份的第一天到结束年份的最后一天的所有日期

create or replace PROCEDURE sp_DATE_DIMENSION(v_START_YEAR IN INT, v_END_YEAR IN INT) AS

--Declare two variables as DATE datatypes
v_CURRENT_DATE DATE;
v_END_DATE     DATE;

BEGIN

--Assign the start year and end year to it's respective variables
v_CURRENT_DATE := TO_DATE('0101' || v_START_YEAR, 'MMDDYYYY');
v_END_DATE     := TO_DATE('1231' || v_END_YEAR,   'MMDDYYYY');

--Clear/Dump what is currently stored in the table
DELETE FROM DATE_DIMENSION;

--Check the condition to see if the start year is less than the end year (Input Parameters)
WHILE v_CURRENT_DATE <= v_END_DATE
LOOP
--DATE_DIMENSION Table
INSERT INTO DATE_DIMENSION
(
    DATE_KEY,
    FULL_DATE_DESCRIPTION,
    DAY_OF_WEEK,
    DAY_OF_MONTH,
    DAY_OF_YEAR,
    LAST_DAY_OF_WEEK_INDICATOR,
    LAST_DAY_OF_MONTH_INDICATOR,
    WEEK_ENDING_DATE,
    MONTH_NUMBER,
    MONTH_NAME,
    YEAR_MONTH,
    QUARTER_NUMBER,
    YEAR_QUARTER,
    YEAR_NUMBER       
)    
VALUES
(
    v_CURRENT_DATE,                                 --DATE_KEY
    TO_CHAR(v_CURRENT_DATE, 'Day, Month DD, YYYY'), --FULL_DATE_DESCRIPTION
    TO_NUMBER(TO_CHAR(v_CURRENT_DATE, 'D')) -1,     --DAY_OF_WEEK
    TO_CHAR(v_CURRENT_DATE,'DD'),                   --DAY_OF_MONTH        
    TO_CHAR(v_CURRENT_DATE,'DDD'),                  --DAY_OF_YEAR
    CASE                                            --LAST_DAY_OF_WEEK_INDICATOR
        WHEN TO_CHAR(v_CURRENT_DATE,'FMDay') = 'Saturday' THEN 'Y'
        ELSE 'N'
    END,
    CASE                                            --LAST_DAY_OF_MONTH_INDICATOR
        WHEN LAST_DAY(TO_DATE(v_CURRENT_DATE, 'MM/DD/YYYY')) = TO_DATE(v_CURRENT_DATE, 'MM/DD/YYYY') THEN 'Y'
        ELSE 'N'
    END,
    CASE                                            --WEEK_ENDING_DATE OF CURRENT WEEK ENDING ON SATURDAY
        WHEN TO_CHAR(v_CURRENT_DATE,'FMDay') = 'Saturday' THEN v_CURRENT_DATE
        ELSE NEXT_DAY(v_CURRENT_DATE,'SATURDAY')
    END,
    TO_CHAR(v_CURRENT_DATE,'MM'),                   --MONTH_NUMBER
    TO_CHAR(v_CURRENT_DATE,'MONTH'),                --MONTH_NAME
    TO_CHAR(v_CURRENT_DATE,'MONTH YYYY'),           --YEAR_MONTH        
    TO_CHAR(v_CURRENT_DATE,'Q'),                    --QUARTER_NUMBER
    TO_CHAR(v_CURRENT_DATE,'YYYY Q'),               --YEAR_QUARTER
    TO_CHAR(v_CURRENT_DATE,'YYYY')                  --YEAR_NUMBER    

);
--Increment and assign the current date value to be re-evaluated
v_CURRENT_DATE := v_CURRENT_DATE + 1;

END LOOP;
END;
创建或替换过程sp_DATE_维度(v_START_YEAR IN INT,v_END_YEAR IN INT)作为
--将两个变量声明为日期数据类型
当前日期;
结束日期;
开始
--将开始年份和结束年份分配给其各自的变量
v_当前日期:=截止日期(“0101”v|u开始日期“MMDDYYYY”);
结束日期:=截止日期('1231'|结束年份,'MMDDYYYY');
--清除/转储表中当前存储的内容
从日期维度删除;
--检查条件,查看开始年份是否小于结束年份(输入参数)

当v_CURRENT_DATE时,这个存储过程应该做什么?请提供更多详细信息。您需要确定如何计算给定日期的每个列值(键来自何处、序列?本地或ISO周数以及开始/结束日期等);并解释这些参数的含义。您想要从年初第一天到年末最后一天的每个日期,还是其他什么?你真的想要一个简单的SQL实现的过程吗?我编辑了我发布的问题来回答这个问题。谢谢回复@AlexPool我现在就试试。感谢您的回复。当我运行您的脚本只是为了查看是否可以执行select查询时,出现了一个错误。这对我帮助很大。谢谢你,迈克尔。