Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 26.99 KB | None | 0 0
  1.     CREATE OR REPLACE PACKAGE BODY pck_load IS
  2.    
  3.        e_load EXCEPTION;
  4.    
  5.        -- ***************************************************
  6.        -- * INITIALIZES DIMENSIONS WITH AN 'INVALID RECORD' *
  7.        -- ***************************************************
  8.        PROCEDURE init_dimensions IS
  9.        BEGIN
  10.           pck_log.write_log('  Initializing all dimensions with "invalid" records');
  11.           -- 'INVALID PRODUCT'
  12.           INSERT INTO t_dim_product (product_key,product_natural_key,product_name,product_brand,product_category,product_size_package,product_type_package,product_diet_type,product_liquid_weight,is_expired_version)
  13.           VALUES (pck_error_codes.c_load_invalid_dim_record_key, pck_error_codes.c_load_invalid_dim_record_Nkey,'INVALID PRODUCT',NULL,NULL,NULL,NULL,NULL,NULL,'NO');
  14.           -- 'INVALID PROMOTION'
  15.           INSERT INTO t_dim_promotion (promo_key,promo_natural_key,promo_name,promo_red_price,promo_advertise,promo_board,promo_start_date,promo_end_date)
  16.           VALUES (pck_error_codes.c_load_invalid_dim_record_key, pck_error_codes.c_load_invalid_dim_record_Nkey,'INVALID PROMOTION',NULL,NULL,NULL,NULL,NULL);
  17.           -- 'INVALID DATE'
  18.           INSERT INTO t_dim_date (date_key,date_full_date,date_month_full,date_month_name,date_month_short_name,date_month_nr,date_quarter_nr,date_quarter_full,date_semester_nr,date_semester_full,date_event,date_year, date_day_nr,date_is_holiday)
  19.           VALUES (pck_error_codes.c_load_invalid_dim_record_key, 'INVALID',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
  20.           -- 'INVALID TIME'
  21.           INSERT INTO t_dim_time (time_key,time_full_time,time_period_of_day,time_minutes_after_midnight,time_hour_nr,time_minute_nr,time_second_nr)
  22.           VALUES (pck_error_codes.c_load_invalid_dim_record_key, 'INVALID',NULL,NULL,NULL,NULL,NULL);
  23.           -- 'INVALID STORE'
  24.           INSERT INTO t_dim_store (store_key,store_natural_key,store_name,store_full_address,store_location,store_district,store_zip_code,store_main_phone,store_main_phone_old,store_fax,store_fax_old,store_manager_name,store_manager_since,store_state,is_expired_version)
  25.           VALUES (pck_error_codes.c_load_invalid_dim_record_key, pck_error_codes.c_load_invalid_dim_record_Nkey, 'INVALID STORE', 'NOT APPLICABLE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'NO');
  26.           -- 'INVALID CUSTOMER'
  27.           INSERT INTO t_dim_customer (customer_key, customer_natural_key, customer_card_number, customer_name, customer_address, customer_location, customer_district, customer_zip_code, customer_phone_nr, customer_gender, customer_gender_old, customer_age, customer_marital_status, is_expired_version)
  28.           VALUES (pck_error_codes.c_load_invalid_dim_record_key, pck_error_codes.c_load_invalid_dim_record_Nkey, NULL,'INVALID CUSTOMER',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NO');
  29.    
  30.           pck_log.write_log('    Done!');
  31.        EXCEPTION
  32.           WHEN OTHERS THEN
  33.              pck_log.write_uncomplete_task_msg;
  34.              RAISE e_load;
  35.        END;
  36.    
  37.    
  38.    
  39.        -- ***********************************
  40.        -- * LOADS THE 'PROMOTION' DIMENSION *
  41.        -- ***********************************
  42.        PROCEDURE load_dim_promotion IS
  43.        CURSOR promocoes IS
  44.         SELECT *
  45.         FROM t_clean_promotions;
  46.        
  47.         l_total PLS_INTEGER;
  48.        
  49.        BEGIN
  50.           pck_log.write_log('  Loading data ["LOAD_DIM_PROMOTIONS"]');
  51.           pck_log.rowcount('t_dim_promotion','Before');
  52.    
  53.           -- FOR EACH NEW OR UPDATED SOURCE PROMOTION, APPLY SCD CHANGES
  54.          
  55.           -- LER t_clean_promotions (clean)
  56.           -- Linha a linha, FAZ
  57.             -- SE o valor de da clean.id não existe na tabela na coluna T_DIM_PROMOTION.PROMO_NATURAL_KEY então
  58.                 -- Cria nova promoção
  59.             -- SENÃO
  60.                 -- Atualiza a linha destino com novos dados
  61.                
  62.           FOR rec IN promocoes LOOP
  63.             SELECT COUNT(*)
  64.             INTO l_total
  65.             FROM t_dim_promotion p
  66.             WHERE p.promo_natural_key = rec.id;
  67.            
  68.             IF (l_total = 0) THEN
  69.                 INSERT INTO t_dim_promotion(promo_key, promo_natural_key, promo_name, promo_red_Price, promo_advertise, promo_board, promo_start_date, promo_end_date)
  70.                 VALUES(SEQ_DIM_PROMOTION.NEXTVAL, rec.ID, rec.NAME, rec.REDUCTION, rec.ON_TV, rec.ON_STREET, rec.START_DATE, rec.END_DATE);
  71.             ELSE
  72.                 UPDATE t_dim_promotion
  73.                 SET promo_name = rec.name, promo_red_Price = rec.REDUCTION,
  74.                     promo_advertise = rec.ON_TV, promo_board = rec.ON_STREET,
  75.                     promo_start_date = rec.START_DATE, promo_end_date = rec.END_DATE
  76.                 WHERE promo_natural_key = rec.id;
  77.             END IF;
  78.           END LOOP;
  79.          
  80.           MERGE INTO t_dim_promotion t1 USING t_clean_promotions t2 ON (t1.PROMO_NATURAL_KEY = t2.ID)
  81.           WHEN MATCHED THEN UPDATE  
  82.                 SET t1.promo_name = t2.name, t1.promo_red_Price = t2.REDUCTION,
  83.                     t1.promo_advertise = t2.ON_TV, t1.promo_board = t2.ON_STREET,
  84.                     t1.promo_start_date = t2.START_DATE, t1.promo_end_date = t2.END_DATE
  85.           WHEN NOT MATCHED THEN INSERT (t1.promo_key, t1.promo_natural_key, t1.promo_name, t1.promo_red_Price, t1.promo_advertise, t1.promo_board, t1.promo_start_date, t1.promo_end_date)
  86.             VALUES(SEQ_DIM_PROMOTION.NEXTVAL, t2.ID, t2.NAME, t2.REDUCTION, t2.ON_TV, t2.ON_STREET, t2.START_DATE, t2.END_DATE);
  87.        
  88.           pck_log.rowcount('t_dim_promotion','After');
  89.           pck_log.write_log('    Done!');
  90.        EXCEPTION
  91.           WHEN OTHERS THEN
  92.              pck_log.write_uncomplete_task_msg;
  93.              RAISE e_load;
  94.        END;
  95.    
  96.    
  97.    
  98.        -- *********************************
  99.        -- * LOADS THE 'PRODUCT' DIMENSION *
  100.        -- *********************************
  101.         PROCEDURE load_dim_product IS
  102.           CURSOR products_cursor IS
  103.              SELECT id,name,brand,pack_size,pack_type,diet_type,liq_weight,category_name
  104.              FROM t_clean_products;
  105.    
  106.           -- COUNTERS
  107.           i INTEGER:=0;
  108.           v_new_products INTEGER:=0;
  109.           v_new_versions INTEGER:=0;
  110.           v_old_versions INTEGER:=0;
  111.    
  112.           -- VARIABLES FOR SCD CHECKING
  113.           v_product_key t_dim_product.product_key%TYPE;
  114.           v_size_package t_dim_product.product_size_package%TYPE;
  115.           v_type_package t_dim_product.product_type_package%TYPE;
  116.           v_diet_type t_dim_product.product_diet_type%TYPE;
  117.           v_liquid_weight t_dim_product.product_liquid_weight%TYPE;
  118.        BEGIN
  119.           pck_log.write_log('  Loading data ["LOAD_DIM_PRODUCT"]');
  120.           pck_log.rowcount('t_dim_product','Before');
  121.    
  122.           FOR rec IN products_cursor LOOP
  123.              -- SEARCH THE PRODUCT IN THE DIMENSION BY SELECTING SCD2 ATTRIBUTES
  124.              BEGIN
  125.                 SELECT product_key, NVL(UPPER(product_size_package),-1),NVL(UPPER(product_type_package),-1),UPPER(product_diet_type),NVL(product_liquid_weight,-1)
  126.                 INTO v_product_key,v_size_package,v_type_package,v_diet_type,v_liquid_weight
  127.                 FROM t_dim_product
  128.                 WHERE product_natural_key=rec.id AND is_expired_version='NO';
  129.    
  130.                 -- IF A RECORD WAS FOUND, THEN THE SOURCE PRODUCT IS IN FACT A NEW VERSION:
  131.                 -- DID ANY OF THE SCD2 ATTRIBUTES CHANGE?
  132.                 IF v_size_package != UPPER(rec.pack_size) OR
  133.                     v_type_package != UPPER(rec.pack_type) OR
  134.                     v_diet_type != UPPER(rec.diet_type) OR
  135.                     v_liquid_weight != UPPER(rec.liq_weight)
  136.                 THEN
  137.                     UPDATE t_dim_product
  138.                     SET IS_EXPIRED_VERSION = 'YES'
  139.                     WHERE v_product_key = product_key;
  140.                
  141.                     INSERT INTO t_dim_product(product_key,PRODUCT_NATURAL_KEY,PRODUCT_NAME,PRODUCT_BRAND,PRODUCT_CATEGORY,PRODUCT_SIZE_PACKAGE,PRODUCT_TYPE_PACKAGE,PRODUCT_DIET_TYPE,PRODUCT_LIQUID_WEIGHT,IS_EXPIRED_VERSION)
  142.                     VALUES (seq_dim_product.NEXTVAL, rec.id,rec.name,rec.brand,rec.category_name,rec.pack_size,rec.pack_type,rec.diet_type,rec.liq_weight,'NO');
  143.                 END IF;
  144.    
  145.              EXCEPTION
  146.                 WHEN NO_DATA_FOUND THEN
  147.                    -- IF NOT FOUND, THEN ITS A NEW PRODUCT
  148.                    INSERT INTO t_dim_product (product_key,PRODUCT_NATURAL_KEY,PRODUCT_NAME,PRODUCT_BRAND,PRODUCT_CATEGORY,PRODUCT_SIZE_PACKAGE,PRODUCT_TYPE_PACKAGE,PRODUCT_DIET_TYPE,PRODUCT_LIQUID_WEIGHT,IS_EXPIRED_VERSION)
  149.                    VALUES (seq_dim_product.NEXTVAL, rec.id,rec.name,rec.brand,rec.category_name,rec.pack_size,rec.pack_type,rec.diet_type,rec.liq_weight,'NO');
  150.                    v_new_products:=v_new_products+1;
  151.              END;
  152.           END LOOP;
  153.    
  154.           -- RECORDS SOME STATISTICS CONCERNING LOADED PRODUCTS
  155.           pck_log.write_log('    '||v_old_versions|| ' old product(s) updated in SCD1 attributes');
  156.           pck_log.write_log('    '||v_new_versions|| ' old product(s) got new version(s) (old have expired)');
  157.           pck_log.write_log('    '||v_new_products|| ' new product(s) found and loaded','    Done!');
  158.           pck_log.rowcount('t_dim_product','After');
  159.        EXCEPTION
  160.           WHEN OTHERS THEN
  161.              pck_log.write_uncomplete_task_msg;
  162.              RAISE e_load;
  163.        END;
  164.    
  165.    
  166.        -- *********************************
  167.        -- * LOADS THE 'CUSTOMER' DIMENSION *
  168.        -- *********************************
  169.        PROCEDURE load_dim_customer IS
  170.           CURSOR customers_cursor IS
  171.              SELECT  id, card_number, name, address, location, district, zip_code, phone_nr, gender, age, marital_status
  172.              FROM t_clean_customers;
  173.    
  174.           -- statistic counters
  175.           i INTEGER:=0;
  176.           v_new_customers INTEGER:=0;
  177.           v_new_versions INTEGER:=0;
  178.           v_old_versions INTEGER:=0;
  179.           -- variables for SCD checking
  180.           v_key t_dim_customer.customer_key%TYPE;
  181.           v_location t_dim_customer.customer_location%TYPE;
  182.           v_district t_dim_customer.customer_district%TYPE;
  183.           v_zip_code t_dim_customer.customer_zip_code%TYPE;
  184.           v_gender t_dim_customer.customer_gender%TYPE;
  185.           v_gender_old v_gender%TYPE;
  186.           v_age t_dim_customer.customer_age%TYPE;
  187.           v_marital_status t_dim_customer.customer_marital_status%TYPE;
  188.       BEGIN
  189.           pck_log.write_log('  Loading data ["LOAD_DIM_CUSTOMER"]');
  190.           pck_log.rowcount('t_dim_customer');
  191.           FOR rec IN customers_cursor LOOP
  192.              -- SEARCHES THE STORE IN THE DIMENSION BY SELECTING SCD2 AND SCD3 ATTRIBUTES (store_main_phone,store_fax)
  193.              BEGIN
  194.                 SELECT customer_key, customer_location, customer_district,customer_zip_code, customer_gender, customer_age, customer_marital_status
  195.                 INTO v_key, v_location, v_district, v_zip_code, v_gender, v_age, v_marital_status
  196.                 FROM t_dim_customer
  197.                 WHERE customer_natural_key=rec.id AND is_expired_version='NO';
  198.    
  199.                 -- IF A RECORD WAS FOUND, THEN THE SOURCE STORE IS IN FACT A NEW CUSTOMER VERSION:
  200.                 -- I WONDER IF THE SCD3 ATTRIBUTE (customer_gender) HAS CHANGED?
  201.                 v_gender_old:=NULL;
  202.                 IF rec.gender<>v_gender THEN
  203.                    -- the old gender is kept
  204.                    v_gender_old:=v_gender;
  205.                 END IF;
  206.    
  207.                 -- WHAT ABOUT SCD2 ATTRIBUTES: HAVE THEY CHANGED?
  208.                 IF rec.location!=v_location OR
  209.                    rec.district!=v_district OR
  210.                    rec.zip_code!=v_zip_code OR
  211.                    rec.age!=v_age OR
  212.                    rec.marital_status!=v_marital_status THEN
  213.                    --  1. UPDATES THE PREVIOUS VERSION OF THE CUSTOMER IN THE DIMENSION TO THE STATE 'EXPIRED'
  214.                    UPDATE t_dim_customer
  215.                    SET is_expired_version='YES'
  216.                    WHERE customer_key=v_key;
  217.    
  218.                    -- 2. INSERTS THE NEW CUSTOMER'S VERSION
  219.                    INSERT INTO t_dim_customer (customer_key, customer_natural_key, customer_card_number, customer_name, customer_address, customer_location, customer_district, customer_zip_code, customer_phone_nr, customer_gender, customer_gender_old, customer_age, customer_marital_status, is_expired_version)
  220.                    VALUES (seq_dim_customer.NEXTVAL, rec.id, rec.card_number,rec.name,rec.address,rec.location,rec.district, rec.zip_code,rec.phone_nr,rec.gender,v_gender_old, rec.age, rec.marital_status,'NO');
  221.                    v_new_versions:=v_new_versions+1;
  222.                 ELSE
  223.                    -- NO SCD2 ATTRIBUTES CHANGED? THEN AT LEAST ONE SCD1 OR SCD3 ATTRIBUTE MUST BE DIFFERENT
  224.                    -- UPDATES THE SCD1 ATTRIBUTES OF THE MOST RECENT VERSION OF THE CUSTOMER
  225.                    UPDATE t_dim_customer
  226.                       -- SCD1
  227.                    SET customer_card_number=rec.card_number,
  228.                        customer_name=rec.name,
  229.                        customer_address=rec.address,
  230.                        customer_phone_nr=rec.phone_nr,
  231.                        -- SCD3
  232.                        customer_gender=rec.gender,
  233.                        customer_gender_old=v_gender_old
  234.                    WHERE customer_key=v_key;
  235.    
  236.                    v_old_versions:=v_old_versions+1;
  237.                 END IF;
  238.              EXCEPTION
  239.                 WHEN NO_DATA_FOUND THEN
  240.                    -- IF NOT FOUND, THEN ITS A NEW CUSTOMER
  241.                    -- SCD3 _old ATTRIBUTE IS NOT FILLED
  242.                    INSERT INTO t_dim_customer (customer_key, customer_natural_key, customer_card_number, customer_name, customer_address, customer_location, customer_district, customer_zip_code, customer_phone_nr, customer_gender, customer_gender_old, customer_age, customer_marital_status, is_expired_version)
  243.                    VALUES (seq_dim_customer.NEXTVAL, rec.id, rec.card_number,rec.name,rec.address,rec.location,rec.district, rec.zip_code,rec.phone_nr,rec.gender,NULL, rec.age, rec.marital_status, 'NO');
  244.                    v_new_customers:=v_new_customers+1;
  245.              END;
  246.           END LOOP;
  247.           -- RECORDS SOME STATISTICS CONCERNING LOADED PRODUCTS
  248.           pck_log.write_log('    '||v_old_versions|| ' old customer(s) updated in SCD1 attributes','    '||v_new_versions|| ' old customer(s) got new version(s) (old have expired)');
  249.           pck_log.write_log('    '||v_new_customers|| ' new customer(s) found and loaded','    Done!');
  250.           pck_log.rowcount('t_dim_customer');
  251.        EXCEPTION
  252.           WHEN OTHERS THEN
  253.              pck_log.write_uncomplete_task_msg;
  254.              RAISE e_load;
  255.        END;
  256.    
  257.    
  258.    
  259.    
  260.        -- *******************************
  261.        -- * LOADS THE 'STORE' DIMENSION *
  262.        -- *******************************
  263.        PROCEDURE load_dim_store IS
  264.           CURSOR stores_cursor IS
  265.              SELECT name,reference,address,zip_code,location,district,telephones,fax,status,manager_name,manager_since
  266.              FROM t_clean_stores;
  267.    
  268.           -- statistic counters
  269.           i INTEGER:=0;
  270.           v_new_stores INTEGER:=0;
  271.           v_new_versions INTEGER:=0;
  272.           v_old_versions INTEGER:=0;
  273.           -- variables for SCD checking
  274.           v_store_key t_dim_store.store_key%TYPE;
  275.           v_store_name t_dim_store.store_name%TYPE;
  276.           v_manager_name t_dim_store.store_manager_name%TYPE;
  277.           v_manager_since t_dim_store.store_manager_since%TYPE;
  278.           v_store_main_phone t_dim_store.store_main_phone%TYPE;
  279.           v_store_fax t_dim_store.store_fax%TYPE;
  280.           v_old_main_phone t_dim_store.store_main_phone%TYPE;
  281.           v_old_fax t_dim_store.store_fax%TYPE;
  282.        BEGIN
  283.           pck_log.write_log('  Loading data ["LOAD_DIM_STORE"]');
  284.           pck_log.rowcount('t_dim_store');
  285.           FOR rec IN stores_cursor LOOP
  286.              -- SEARCHES THE STORE IN THE DIMENSION BY SELECTING SCD2 AND SCD3 ATTRIBUTES (store_main_phone,store_fax)
  287.              BEGIN
  288.                 SELECT store_key, UPPER(store_name),UPPER(store_manager_name),store_manager_since, store_main_phone,store_fax
  289.                 INTO v_store_key,v_store_name,v_manager_name,v_manager_since,v_store_main_phone,v_store_fax
  290.                 FROM t_dim_store
  291.                 WHERE store_natural_key=rec.reference AND is_expired_version='NO';
  292.    
  293.                 -- IF A RECORD WAS FOUND, THEN THE SOURCE STORE IS IN FACT A NEW STORE VERSION:
  294.                 -- I WONDER IF ANY OF THE SCD3 ATTRIBUTES (store_main_phone,store_fax) HAVE CHANGED?
  295.                 v_old_main_phone:=NULL;
  296.                 IF rec.telephones<>v_store_main_phone THEN
  297.                    -- the old phone is kept
  298.                    v_old_main_phone:=v_store_main_phone;
  299.                 END IF;
  300.                 v_old_fax:=NULL;
  301.                 IF rec.fax<>v_store_fax THEN
  302.                    -- the old fax is kept
  303.                    v_old_fax:=v_store_fax;
  304.                 END IF;
  305.    
  306.                 -- I WONDER IF ANY OF THE SCD2 ATTRIBUTES HAVE CHANGED?
  307.                 IF UPPER(rec.name)!=v_store_name OR
  308.                    UPPER(rec.manager_name)!=v_manager_name OR
  309.                    rec.manager_since!=v_manager_since THEN
  310.                    --  1. UPDATES THE PREVIOUS VERSION OF THE STORE IN THE DIMENSION TO THE STATE 'EXPIRED'
  311.                    UPDATE t_dim_store
  312.                    SET is_expired_version='YES'
  313.                    WHERE store_key=v_store_key;
  314.    
  315.                    -- 2. INSERTS THE NEW STORE'S VERSION
  316.                    INSERT INTO t_dim_store (store_key,store_natural_key,store_name,store_full_address,store_location,store_district,store_zip_code,store_main_phone,store_main_phone_old,store_fax,store_fax_old,store_manager_name,store_manager_since,store_state,is_expired_version)
  317.                    VALUES (seq_dim_store.NEXTVAL, rec.reference,rec.name,rec.address,rec.location,rec.district,rec.zip_code,rec.telephones,v_old_main_phone,rec.fax,v_old_fax,rec.manager_name,rec.manager_since,rec.status,'NO');
  318.                    v_new_versions:=v_new_versions+1;
  319.                 ELSE
  320.                    -- NO SCD2 ATTRIBUTES CHANGED? THEN AT LEAST ONE SCD1 OR SCD3 ATTRIBUTE MUST BE DIFFERENT
  321.                    -- UPDATES THE SCD1 ATTRIBUTES OF THE MOST RECENT VERSION OF THE STORE
  322.                    UPDATE t_dim_store
  323.                    SET store_full_address=rec.address,
  324.                        store_location=rec.location,
  325.                        store_district=rec.district,
  326.                        store_zip_code=rec.zip_code,
  327.                        store_manager_since=rec.manager_since,
  328.                        store_manager_name=rec.manager_name,
  329.                        -- SCD3 attributes
  330.                        store_main_phone=rec.telephones,
  331.                        store_fax=rec.fax,
  332.                        store_main_phone_old=v_old_main_phone,
  333.                        store_fax_old=v_old_fax
  334.                    WHERE store_key=v_store_key;
  335.    
  336.                    v_old_versions:=v_old_versions+1;
  337.                 END IF;
  338.              EXCEPTION
  339.                 WHEN NO_DATA_FOUND THEN
  340.                    -- IF NOT FOUND, THEN ITS A NEW STORE
  341.                    -- SCD3 _old ATTRIBUTES ARE NOT FILLED
  342.                    INSERT INTO t_dim_store (store_key,store_natural_key,store_name,store_full_address,store_location,store_district,store_zip_code,store_main_phone,store_main_phone_old,store_fax,store_fax_old,store_manager_name,store_manager_since,store_state,is_expired_version)
  343.                    VALUES (seq_dim_store.NEXTVAL, rec.reference,rec.name,rec.address,rec.location,rec.district,rec.zip_code,rec.telephones,NULL,rec.fax,NULL,rec.manager_name,rec.manager_since,rec.status,'NO');
  344.                    v_new_stores:=v_new_stores+1;
  345.              END;
  346.           END LOOP;
  347.           -- RECORDS SOME STATISTICS CONCERNING LOADED PRODUCTS
  348.           pck_log.write_log('    '||v_old_versions|| ' old store(s) updated in SCD1 attributes','    '||v_new_versions|| ' old store(s) got new version(s) (old have expired)');
  349.           pck_log.write_log('    '||v_new_stores|| ' new store(s) found and loaded','    Done!');
  350.           pck_log.rowcount('t_dim_store');
  351.        EXCEPTION
  352.           WHEN OTHERS THEN
  353.              pck_log.write_uncomplete_task_msg;
  354.              RAISE e_load;
  355.        END;
  356.    
  357.    
  358.    
  359.        -- ******************************
  360.        -- * LOADS THE 'DATE' DIMENSION *
  361.        -- ******************************
  362.        PROCEDURE load_dim_date(p_load_dates_from_file BOOLEAN) IS
  363.           l_today VARCHAR2(10);   -- today's date
  364.        BEGIN
  365.           pck_log.write_log('  Loading data ["LOAD_DIM_DATE"]');
  366.           -- LOAD ALL DATE RECORDS USING THE EXTERNAL TABLE 't_external_date'
  367.           IF (p_load_dates_from_file=TRUE) THEN
  368.              INSERT INTO t_dim_date(date_key,date_full_date,date_month_full,date_month_name,date_month_short_name,date_month_nr,date_quarter_nr,date_quarter_full,date_semester_nr,date_semester_full,date_day_nr,date_is_holiday,date_event,date_year)
  369.                 SELECT  date_key,
  370.                 date_full_date,
  371.                 date_month_full,
  372.                 date_month_name,
  373.                 date_month_short_name,
  374.                 date_month_nr,
  375.                 date_quarter_nr,
  376.                 date_quarter_full,
  377.                 date_semester_nr,
  378.                 date_semester_full,
  379.                 date_day_nr,
  380.                 date_is_holiday,
  381.                 date_event,
  382.                 date_year
  383.                 FROM t_ext_dates;
  384.           END IF;
  385.    
  386.           -- RECORDS LOG
  387.           pck_log.write_log('    '||SQL%ROWCOUNT ||' record(s) successfully loaded','    Done!');
  388.    
  389.           -- find today's date
  390.           l_today:=TO_CHAR(SYSDATE,'dd-mm-yyyy');
  391.    
  392.           -- UPDATE THE TEMPERATURE STATUS. SOMTHING IS MISSING...
  393.           NULL;
  394.    
  395.           -- RECORDS LOG
  396.           pck_log.write_log('    '||SQL%ROWCOUNT ||' temperature row(s) updated','    Done!');
  397.    
  398.        EXCEPTION
  399.           WHEN OTHERS THEN
  400.              pck_log.write_uncomplete_task_msg;
  401.              RAISE e_load;
  402.        END;
  403.    
  404.    
  405.    
  406.        -- ******************************
  407.        -- * LOADS THE 'TIME' DIMENSION *
  408.        -- ******************************
  409.        PROCEDURE load_dim_time IS
  410.        BEGIN
  411.           pck_log.write_log('  Loading data ["LOAD_DIM_TIME"]');
  412.           -- LOAD ALL TIME RECORDS USING THE EXTERNAL TABLE 't_external_time'
  413.           INSERT INTO /*+ APPEND */ t_dim_time(time_key,time_full_time,time_period_of_day,time_minutes_after_midnight,time_hour_nr,time_minute_nr,time_second_nr)
  414.              SELECT     time_key,
  415.                       time_full_time,
  416.                       time_period_of_day,
  417.                       time_minutes_after_00,
  418.                       time_hour_nr,
  419.                       time_minute_nr,
  420.                       time_second_nr
  421.              FROM t_ext_time;
  422.    
  423.           pck_log.write_log('    '||SQL%ROWCOUNT ||' record(s) successfully loaded','    Done!');
  424.        EXCEPTION
  425.           WHEN OTHERS THEN
  426.              pck_log.write_uncomplete_task_msg;
  427.              RAISE e_load;
  428.        END;
  429.    
  430.    
  431.    
  432.        -- ************************
  433.        -- * LOADS THE FACT TABLE *
  434.        -- ************************
  435.     PROCEDURE load_fact_table IS
  436.           v_source_lines INTEGER;
  437.        BEGIN
  438.           pck_log.write_log('  Loading data ["LOAD_FACT_TABLE"]');
  439.    
  440.           -- JUST FOR STATISTICS
  441.           SELECT COUNT(*)
  442.           INTO v_source_lines
  443.           FROM t_clean_linesofsale;
  444.    
  445.           INSERT INTO T_FACT_LINEOFSALE(product_key, store_key, date_key, time_key, promo_key, customer_key, sale_id_dd, sold_quantity, ammount_sold)
  446.           SELECT
  447.             product_key,
  448.             store_key,
  449.             date_key,
  450.             time_key,
  451.             promo_key,
  452.             customer_key,
  453.             los.sale_id,
  454.             los.quantity,
  455.             los.ammount_paid
  456.           FROM
  457.             t_clean_linesofsale los JOIN t_clean_sales sales ON los.sale_id = sales.id
  458.             JOIN t_dim_product ON t_dim_product.product_natural_key = los.product_id
  459.             LEFT JOIN t_dim_promotion ON promo_natural_key = NVL(los.product_id, -1)
  460.             JOIN t_dim_store ON store_natural_key = sales.store_id
  461.             JOIN t_dim_date ON date_full_date = TO_CHAR(los.line_date, 'dd-mm-yyyy')
  462.             JOIN t_dim_time ON time_full_time = TO_CHAR(los.line_date, 'hh24:mi:ss')
  463.             JOIN t_dim_customer ON customer_natural_key = sales.customer_id
  464.           WHERE
  465.             t_dim_product.is_expired_version = 'NO';
  466.    
  467.           pck_log.write_log('    '||SQL%ROWCOUNT ||' fact(s) loaded','    Done!');
  468.        EXCEPTION
  469.           WHEN NO_DATA_FOUND THEN
  470.              pck_log.write_log('    No facts generated from '||v_source_lines||' source lines-of-sale');
  471.           WHEN OTHERS THEN
  472.              pck_log.write_uncomplete_task_msg;
  473.              RAISE e_load;
  474.        END;
  475.    
  476.    
  477.    
  478.    
  479.        -- *****************************************************************************************************
  480.        -- *                                             MAIN                                                  *
  481.        -- *                                                                                                   *
  482.        -- * EXECUTES THE LOADING PROCESS                                                                      *
  483.        -- * IN                                                                                                *
  484.        -- *     p_load_dates: TRUE=t_dim_date dimension will be loaded                                        *
  485.        -- *     p_init_dimensions: TRUE=all dimensions will be filled with an INVALID record                  *
  486.        -- *****************************************************************************************************
  487.        PROCEDURE main (p_load_dates BOOLEAN,
  488.                        p_init_dimensions BOOLEAN) IS
  489.        BEGIN
  490.           pck_log.write_log(' ','*****  LOAD  LOAD  LOAD  LOAD  LOAD  LOAD  LOAD  LOAD  *****');
  491.    
  492.           -- LOADS 'DATE' DIMENSIONS
  493.           /*IF p_load_dates THEN
  494.              load_dim_time;
  495.           END IF;
  496.           load_dim_date(p_load_dates);*/  -- loads dates from file or just updates weather status
  497.    
  498.           -- INTIALIZE DIMENSIONS
  499.           IF p_init_dimensions THEN
  500.              init_dimensions;
  501.           END IF;
  502.    
  503.           -- LOAD DIMENSIONS
  504.           load_dim_customer;
  505.           load_dim_product;
  506.           load_dim_promotion;
  507.           load_dim_store;
  508.           load_fact_table;
  509.    
  510.           COMMIT;
  511.           pck_log.write_log('  All data loaded and commited to database');
  512.        EXCEPTION
  513.           WHEN e_load THEN
  514.              pck_log.write_halt_msg;
  515.              ROLLBACK;
  516.           WHEN OTHERS THEN
  517.              ROLLBACK;
  518.              pck_log.write_uncomplete_task_msg;
  519.              pck_log.write_halt_msg;
  520.        END;
  521.     END pck_load;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement