Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 17.95 KB | None | 0 0
  1. CREATE OR REPLACE PACKAGE BODY pck_transform IS
  2.  
  3.    e_transformation EXCEPTION;
  4.  
  5.    -- *********************************************
  6.    -- * PUTS AN ERROR IN THE FACT TABLE OF ERRORS *
  7.    -- *********************************************
  8.    PROCEDURE error_log(p_screen_name t_tel_screen.screen_name%TYPE,
  9.                        p_hora_deteccao DATE,
  10.                        p_source_key      t_tel_source.source_key%TYPE,
  11.                        p_iteration_key   t_tel_iteration.iteration_key%TYPE,
  12.                        p_record_id       t_tel_error.record_id%TYPE) IS
  13.       v_date_key t_tel_date.date_key%TYPE;
  14.       v_screen_key t_tel_screen.screen_key%TYPE;
  15.    BEGIN
  16.       -- obtém o id da dimensão «date» referente ao dia em que o erro foi detectado
  17.       BEGIN
  18.          SELECT date_key
  19.          INTO v_date_key
  20.          FROM t_tel_date
  21.          WHERE date_full=TO_CHAR(p_hora_deteccao,'DD-MM-YYYY');
  22.       EXCEPTION
  23.          WHEN NO_DATA_FOUND THEN
  24.             pck_log.write_log('    -- ERROR --   could not find date key from "t_tel_date" ['||sqlerrm||']');
  25.             RAISE e_transformation;
  26.       END;
  27.  
  28.       BEGIN
  29.          SELECT screen_key
  30.          INTO v_screen_key
  31.          FROM t_tel_screen
  32.          WHERE UPPER(screen_name)=UPPER(p_screen_name);
  33.       EXCEPTION
  34.          WHEN NO_DATA_FOUND THEN
  35.             pck_log.write_log('    -- ERROR --   could not find screen key from "t_tel_screen" ['||sqlerrm||']');
  36.             RAISE e_transformation;
  37.       END;
  38.  
  39.       INSERT INTO t_tel_error (date_key,screen_key,source_key,iteration_key, record_id) VALUES (v_date_key,v_screen_key,p_source_key,p_iteration_key, p_record_id);
  40.    EXCEPTION
  41.       WHEN OTHERS THEN
  42.          pck_log.write_log('    -- ERROR --   could not write quality problem to "t_tel_error" fact table ['||sqlerrm||']');
  43.          RAISE e_transformation;
  44.    END;
  45.  
  46.  
  47.  
  48.    -- *******************************************
  49.    -- * DUPLICATES THE LAST SCHEDULED ITERATION *
  50.    -- *******************************************
  51.    PROCEDURE duplicate_last_iteration(p_start_date t_tel_iteration.iteration_start_date%TYPE) IS
  52.       v_last_iteration_key t_tel_iteration.iteration_key%TYPE;
  53.       v_new_iteration_key t_tel_iteration.iteration_key%TYPE;
  54.  
  55.       CURSOR c_scheduled_screens(p_iteration_key t_tel_iteration.iteration_key%TYPE) IS
  56.          SELECT s.screen_key AS screen_key,screen_name,screen_order, s.source_key
  57.          FROM t_tel_schedule s, t_tel_screen
  58.          WHERE iteration_key=p_iteration_key AND
  59.                s.screen_key = t_tel_screen.screen_key;
  60.    BEGIN
  61.       pck_log.write_log('  Creating new iteration by duplicating the previous one');
  62.  
  63.       -- FIND THE LAST ITERATIONS'S KEY
  64.       BEGIN
  65.          SELECT MAX(iteration_key)
  66.          INTO v_last_iteration_key
  67.          FROM t_tel_iteration;
  68.       EXCEPTION
  69.          WHEN NO_DATA_FOUND THEN
  70.             pck_log.write_log('    -- ERROR --   could not find iteration key ['||sqlerrm||']');
  71.             RAISE e_transformation;
  72.       END;
  73.  
  74.       INSERT INTO t_tel_iteration(iteration_start_date) VALUES (p_start_date) RETURNING iteration_key INTO v_new_iteration_key;
  75.       FOR rec IN c_scheduled_screens(v_last_iteration_key) LOOP
  76.          -- schedule screen
  77.          INSERT INTO t_tel_schedule(screen_key,iteration_key,source_key,screen_order)
  78.          VALUES (rec.screen_key,v_new_iteration_key,rec.source_key,rec.screen_order);
  79.       END LOOP;
  80.       pck_log.write_log('    Done!');
  81.    EXCEPTION
  82.       WHEN NO_DATA_FOUND THEN
  83.          pck_log.write_log('    -- ERROR --   previous iteration has no screens to reschedule');
  84.          RAISE e_transformation;
  85.       WHEN OTHERS THEN
  86.          pck_log.write_uncomplete_task_msg;
  87.          RAISE e_transformation;
  88.    END;
  89.  
  90.  
  91.    PROCEDURE screen_product_dimensions (p_iteration_key t_tel_iteration.iteration_key%TYPE,
  92.                                         p_source_key t_tel_source.source_key%TYPE,
  93.                                         p_screen_order t_tel_schedule.screen_order%TYPE) IS
  94.       -- SEARCH FOR EXTRACTED PRODUCTS CONTAINING PROBLEMS
  95.       CURSOR products_with_problems IS
  96.          SELECT rowid
  97.          FROM t_data_products
  98.          WHERE rejected_by_screen='0'
  99.                AND (((width IS NULL OR height IS NULL OR depth IS NULL) AND UPPER(pack_type) IN (SELECT pack_type
  100.                                                                           FROM t_lookup_pack_dimensions
  101.                                                                           WHERE has_dimensions='1'))
  102.                OR ((width>=0 OR height>=0 OR depth>=0 AND UPPER(pack_type) IN (SELECT pack_type
  103.                                                                                FROM t_lookup_pack_dimensions
  104.                                                                                WHERE has_dimensions='0'))));
  105.       i PLS_INTEGER:=0;
  106.       v_screen_name VARCHAR2(30):='screen_product_dimensions';
  107.    BEGIN
  108.       pck_log.write_log('  Starting SCREEN ["'||UPPER(v_screen_name)||'"] with order #'||p_screen_order||'');
  109.       FOR rec IN products_with_problems LOOP
  110.          -- RECORDS THE ERROR IN THE TRANSFORMATION ERROR LOGGER BUT DOES * NOT REJECT THE LINE *
  111.          error_log(v_screen_name,SYSDATE,p_source_key,p_iteration_key,rec.rowid);
  112.          i:=i+1;
  113.       END LOOP;
  114.       pck_log.write_log('    Data quality problems in '|| i || ' row(s).','    Done!');
  115.    EXCEPTION
  116.       WHEN NO_DATA_FOUND THEN
  117.          pck_log.write_log('    No data quality problems found.','    Done!');
  118.       WHEN OTHERS THEN
  119.          pck_log.write_uncomplete_task_msg;
  120.          RAISE e_transformation;
  121.    END;
  122.  
  123.  
  124.    -- *************************************************************************************
  125.    -- * GOAL: detect and reject packed products with an empty liquid weight               *
  126.    -- * QUALITY CRITERIUM: "Completude"                                                   *
  127.    -- * PARAMETERS:                                                                       *
  128.    -- *     p_iteration_key: key of the iteration in which the screen will be run         *
  129.    -- *     p_source_key: key of the source system related to the screen's execution      *
  130.    -- *     p_screen_order: order number in which the screen is to be executed            *
  131.    -- *************************************************************************************
  132.    PROCEDURE screen_null_liq_weight (p_iteration_key t_tel_iteration.iteration_key%TYPE,
  133.                                      p_source_key t_tel_source.source_key%TYPE,
  134.                                      p_screen_order t_tel_schedule.screen_order%TYPE) IS
  135.                                      
  136.       cursor products_with_problems IS
  137.         SELECT rowid
  138.         FROM t_data_products
  139.         WHERE (liq_weight IS NULL AND pack_type IS NOT NULL)
  140.             OR (liq_weight IS NOT NULL AND pack_type IS NULL);
  141.                                      
  142.       i PLS_INTEGER:=0;
  143.       v_screen_name VARCHAR2(30):='screen_null_liq_weight';
  144.    BEGIN
  145.       pck_log.write_log('  Starting SCREEN ["'||UPPER(v_screen_name)||'"] with order #'||p_screen_order||'');
  146.  
  147.       FOR rec IN products_with_problems loop
  148.             UPDATE t_data_products SET rejected_by_screen = 1
  149.                 WHERE rowid = rec.rowid;
  150.             error_log(v_screen_name,SYSDATE,p_source_key,p_iteration_key,rec.rowid);
  151.             i:=i+1;
  152.         END loop;
  153.  
  154.       pck_log.write_log('    Data quality problems in '|| i || ' row(s).','    Done!');
  155.    EXCEPTION
  156.       WHEN NO_DATA_FOUND THEN
  157.          pck_log.write_log('    No data quality problems found.','    Done!');
  158.       WHEN OTHERS THEN
  159.          pck_log.write_uncomplete_task_msg;
  160.          RAISE e_transformation;
  161.    END;
  162.  
  163.  
  164.  
  165.  
  166.    -- *************************************************************************************
  167.    -- * GOAL: detect incorrect data in products                                        *
  168.    -- * QUALITY CRITERIUM: "Correção"                                                 *
  169.    -- * PARAMETERS:                                                                       *
  170.    -- *     p_iteration_key: key of the iteration in which the screen will be run         *
  171.    -- *     p_source_key: key of the source system related to the screen's execution      *
  172.    -- *     p_screen_order: order number in which the screen is to be executed            *
  173.    -- *************************************************************************************
  174.     PROCEDURE SCREEN_INCORRECT_BRANDS ( p_iteration_key t_tel_iteration.iteration_key%TYPE,
  175.                                             p_source_key t_tel_source.source_key%TYPE,
  176.                                             p_screen_order t_tel_schedule.screen_order%TYPE) IS
  177.        
  178.         cursor products_with_problems IS
  179.             SELECT p.rowid, p.name, p.brand
  180.             FROM t_data_products p
  181.             JOIN t_lookup_brands b ON b.brand_wrong = p.brand
  182.             WHERE rejected_by_screen = '0';
  183.  
  184.         i PLS_INTEGER:=0;
  185.         v_screen_name VARCHAR2(30):='screen_incorrect_brands';
  186.     BEGIN    
  187.         pck_log.write_log('  Starting SCREEN ["'||UPPER(v_screen_name)||'"] with order #'||p_screen_order||'');
  188.  
  189.        
  190.         FOR rec IN products_with_problems loop
  191.             error_log(v_screen_name,SYSDATE,p_source_key,p_iteration_key,rec.rowid);
  192.             i:=i+1;
  193.         END loop;
  194.  
  195.       pck_log.write_log('    Data quality problems in '|| i || ' row(s).','    Done!');
  196.    EXCEPTION
  197.       WHEN NO_DATA_FOUND THEN
  198.          pck_log.write_log('    No data quality problems found.','    Done!');
  199.       WHEN OTHERS THEN
  200.          pck_log.write_uncomplete_task_msg;
  201.          RAISE e_transformation;
  202.    END;
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.    -- ####################### TRANSFORMATION ROUTINES #######################
  215.  
  216.     PROCEDURE transform_products IS
  217.     BEGIN
  218.         pck_log.write_log('  Transforming data ["TRANSFORM_PRODUCTS"]');
  219.  
  220.         INSERT INTO t_clean_products(id,name,brand,pack_size,pack_type,diet_type,liq_weight,category_name)
  221.         SELECT prod.id,prod.name, CASE WHEN brand=b.brand_wrong THEN b.brand_transformed ELSE brand END,
  222.         height||'x'||width||'x'||depth,pack_type,cal.TYPE,liq_weight,categ.name
  223.         FROM t_data_products prod LEFT JOIN t_lookup_brands b ON brand=b.brand_wrong, t_lookup_calories cal, t_data_categories categ
  224.         WHERE   categ.rejected_by_screen='0'
  225.                 AND prod.rejected_by_screen='0'
  226.                 AND calories_100g>=cal.min_calories_100g
  227.                 AND calories_100g<=cal.max_calories_100g
  228.                 AND categ.id=prod.category_id;
  229.  
  230.    
  231.        
  232.        
  233.  
  234.         pck_log.write_log('    Done!');
  235.     EXCEPTION
  236.         WHEN NO_DATA_FOUND THEN
  237.             pck_log.write_log('    Found no lines to transform','    Done!');
  238.         WHEN OTHERS THEN
  239.            pck_log.write_uncomplete_task_msg;
  240.            RAISE e_transformation;
  241.     END;
  242.  
  243.  
  244.  
  245.    -- **********************************************************
  246.    -- * TRANSFORMATION OF STORES ACCORDING TO LOGICAL DATA MAP *
  247.    -- **********************************************************
  248.    PROCEDURE transform_stores IS
  249.    BEGIN
  250.       pck_log.write_log('  Transforming data ["TRANSFORM_STORES"]');
  251.  
  252.       INSERT INTO t_clean_stores(name,reference,address,zip_code,location,district,telephones,fax,STATUS,manager_name,manager_since)
  253.       SELECT name,s.reference,CASE building WHEN '-' THEN NULL ELSE building||' - ' END || address||' / '||zip_code||', '||location,zip_code,location,district,SUBSTR(REPLACE(REPLACE(telephones,'.',''),' ',''),1,9),fax,CASE WHEN closure_date IS NULL THEN 'ACTIVE' ELSE 'INACTIVE' END, manager_name,manager_since
  254.       FROM (SELECT name,reference,building,address,zip_code,location,district,telephones,fax,closure_date
  255.             FROM t_data_stores_new
  256.             WHERE rejected_by_screen='0'
  257.             MINUS
  258.             SELECT name,reference,building,address,zip_code,location,district,telephones,fax,closure_date
  259.             FROM t_data_stores_old) s, t_data_managers_new d
  260.       WHERE s.reference=d.reference AND
  261.             d.rejected_by_screen='0';
  262.  
  263.       pck_log.write_log('    Done!');
  264.    EXCEPTION
  265.       WHEN NO_DATA_FOUND THEN
  266.          pck_log.write_log('    Found no lines to transform','    Done!');
  267.       WHEN OTHERS THEN
  268.          pck_log.write_uncomplete_task_msg;
  269.          RAISE e_transformation;
  270.    END;
  271.  
  272.  
  273.    -- *********************************************************
  274.    -- * TRANSFORMATION OF SALES ACCORDING TO LOGICAL DATA MAP *
  275.    -- *********************************************************
  276.    PROCEDURE transform_sales IS
  277.    BEGIN
  278.       pck_log.write_log('  Transforming data ["TRANSFORM_SALES"]');
  279.  
  280.       INSERT INTO t_clean_sales(id,sale_date,store_id)
  281.       SELECT id,sale_date,store_id
  282.       FROM t_data_sales
  283.       WHERE rejected_by_screen='0';
  284.  
  285.       pck_log.write_log('    Done!');
  286.    EXCEPTION
  287.       WHEN NO_DATA_FOUND THEN
  288.          pck_log.write_log('    Found no lines to transform','    Done!');
  289.       WHEN OTHERS THEN
  290.          pck_log.write_uncomplete_task_msg;
  291.          RAISE e_transformation;
  292.    END;
  293.  
  294.  
  295.  
  296.  
  297.    -- *****************************************************************
  298.    -- * TRANSFORMATION OF LINES OF SALE ACCORDING TO LOGICAL DATA MAP *
  299.    -- *****************************************************************
  300.    PROCEDURE transform_linesofsale IS
  301.    BEGIN
  302.       pck_log.write_log('  Transforming data ["TRANSFORM_LINESOFSALE"]');
  303.  
  304.       INSERT INTO t_clean_linesofsale(id,sale_id,product_id,promo_id,quantity,ammount_paid,line_date)
  305.       SELECT los.id,los.sale_id,los.product_id,losp.promo_id,quantity,ammount_paid, los.line_date
  306.       FROM t_data_linesofsale los LEFT JOIN (SELECT line_id,promo_id
  307.                                             FROM t_data_linesofsalepromotions
  308.                                             WHERE rejected_by_screen='0') losp ON los.id=losp.line_id, t_data_sales
  309.       WHERE los.rejected_by_screen='0' AND
  310.             t_data_sales.id=los.sale_id;
  311.  
  312.       pck_log.write_log('    Done!');
  313.    EXCEPTION
  314.       WHEN NO_DATA_FOUND THEN
  315.          pck_log.write_log('    Found no lines to transform','    Done!');
  316.       WHEN OTHERS THEN
  317.          pck_log.write_uncomplete_task_msg;
  318.          RAISE e_transformation;
  319.    END;
  320.    
  321.    -- **********************************************************
  322.    -- * TRANSFORMATION OF PROMOTIONS ACCORDING TO LOGICAL DATA MAP *
  323.    -- **********************************************************
  324.    PROCEDURE transform_promotions IS
  325.    BEGIN
  326.       pck_log.write_log('  Transforming data ["TRANSFORM_PROMOTIONS]');
  327.  
  328.       INSERT INTO t_clean_promotions(id,name,start_date,end_date,reduction,on_street,on_tv)
  329.       SELECT id, name, start_date, end_date, reduction, CASE on_outdoor WHEN 1 THEN 'YES' ELSE 'NO' END AS outdoor, CASE on_tv WHEN 1 THEN 'YES' ELSE 'NO' END AS TV
  330.       FROM t_data_promotions p
  331.       WHERE rejected_by_screen=0;
  332.  
  333.       pck_log.write_log('    Done!');
  334.    EXCEPTION
  335.       WHEN NO_DATA_FOUND THEN
  336.          pck_log.write_log('    Found no lines to transform','    Done!');
  337.       WHEN OTHERS THEN
  338.          pck_log.write_uncomplete_task_msg;
  339.          RAISE e_transformation;
  340.    END;
  341.  
  342.  
  343.    -- *****************************************************************************************************
  344.    -- *                                             MAIN                                                  *
  345.    -- *                                                                                                   *
  346.    -- * EXECUTE THE TRANSFORMATION PROCESS                                                               *
  347.    -- * IN                                                                                                *
  348.    -- *     p_duplicate_last_iteration: TRUE=duplicate last iteration and its schedule (FOR TESTS ONLY!) *
  349.    -- *****************************************************************************************************
  350.    PROCEDURE main (p_duplicate_last_iteration BOOLEAN) IS
  351.  
  352.       -- GET ALL SCHEDULED SCREENS
  353.       cursor scheduled_screens_cursor(p_iteration_key t_tel_iteration.iteration_key%TYPE) IS
  354.          SELECT UPPER(screen_name) screen_name,source_key,screen_order
  355.          FROM t_tel_schedule, t_tel_screen
  356.          WHERE iteration_key=p_iteration_key AND
  357.               t_tel_schedule.screen_key=t_tel_screen.screen_key;
  358.  
  359.       v_iteration_key t_tel_iteration.iteration_key%TYPE;
  360.       v_sql VARCHAR2(200);
  361.    BEGIN
  362.       pck_log.write_log(' ','*****  TRANSFORM  TRANSFORM  TRANSFORM  TRANSFORM  TRANSFORM  TRANSFORM  *****');      -- DUPLICATES THE LAST ITERATION AND THE CORRESPONDING SCREEN SCHEDULE
  363.       -- DUPLICATES THE LAST ITERATION WITH THEN CORRESPONDING SCHEDULE
  364.       IF p_duplicate_last_iteration THEN
  365.          duplicate_last_iteration(SYSDATE);
  366.       END IF;
  367.  
  368.       -- CLEAN ALL _clean TABLES
  369.       pck_log.write_log('  Deleting old _clean tables');
  370.       DELETE FROM t_clean_products;
  371.       DELETE FROM t_clean_linesofsale;
  372.       DELETE FROM t_clean_stores;
  373.       DELETE FROM t_clean_promotions;
  374.       DELETE FROM t_clean_sales;
  375.       pck_log.write_log('    Done!');
  376.  
  377.       -- FIND THE MOST RECENTLY SCHEDULED ITERATION
  378.       BEGIN
  379.          SELECT MAX(i.iteration_key)
  380.          INTO v_iteration_key
  381.          FROM t_tel_iteration i
  382.          WHERE TO_CHAR(sysdate, 'yyyy-mm-dd') = TO_CHAR(i.iteration_start_date, 'yyyy-mm-dd');
  383.       EXCEPTION
  384.          WHEN OTHERS THEN
  385.             RAISE e_transformation;
  386.       END;
  387.  
  388.       -- RUN ALL SCHEDULED SCREENS
  389.       FOR rec IN scheduled_screens_cursor(v_iteration_key) LOOP
  390.          v_sql:='BEGIN pck_transform.'||rec.screen_name||'('||v_iteration_key||','||rec.source_key||','||rec.screen_order||'); END;';
  391.          pck_log.write_log(v_sql);
  392.          EXECUTE immediate v_sql;
  393.       END LOOP;
  394.  
  395.       pck_log.write_log('  All screens have been run.');
  396.       -- EXECUTE THE TRANSFORMATION ROUTINES
  397.       transform_products;
  398.       transform_stores;
  399.       transform_sales;
  400.       transform_linesofsale;
  401.       transform_promotions;
  402.      
  403.  
  404.         COMMIT;
  405.         pck_log.write_log('  All transformed data commited to database.');
  406.     EXCEPTION
  407.         WHEN e_transformation THEN
  408.             pck_log.write_halt_msg;
  409.             ROLLBACK;
  410.         WHEN OTHERS THEN
  411.             ROLLBACK;
  412.             pck_log.write_uncomplete_task_msg;
  413.             pck_log.write_halt_msg;
  414.     END;
  415.  
  416. END pck_transform;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement