Advertisement
Guest User

Untitled

a guest
Oct 8th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 17.36 KB | None | 0 0
  1. CREATE OR REPLACE PACKAGE BODY pck_extract IS
  2.  
  3.    e_extraction EXCEPTION;
  4.  
  5.    -- **********************************************
  6.    -- * INTITALIZES THE t_info_extractions TABLE   *
  7.    -- **********************************************
  8.    PROCEDURE initialize_extractions_table (p_clean_before BOOLEAN) IS
  9.       v_source_table VARCHAR2(100);
  10.    BEGIN
  11.       BEGIN
  12.          pck_log.write_log('  Initializing data required for extraction ["INITIALIZE_EXTRACTIONS_TABLE"]');
  13.          IF p_clean_before=TRUE THEN
  14.             pck_log.write_log('    Deleting previous data');
  15.             DELETE FROM t_info_extractions;
  16.             pck_log.write_log('      Done!');
  17.  
  18.             pck_log.write_log('    Deleting %_new and %_old data');
  19.             DELETE FROM t_data_managers_new;
  20.             DELETE FROM t_data_managers_old;
  21.             DELETE FROM t_data_stores_new;
  22.             DELETE FROM t_data_stores_old;
  23.             DELETE FROM t_data_celsius;
  24.             pck_log.write_log('      Done!');
  25.          END IF;
  26.       EXCEPTION
  27.          WHEN OTHERS THEN
  28.             pck_log.write_uncomplete_task_msg;
  29.             RAISE e_extraction;
  30.       END;
  31.  
  32.       INSERT INTO t_info_extractions (last_timestamp,source_table_name) VALUES (NULL,'view_produtos@DBLINK_SADSB');
  33.       INSERT INTO t_info_extractions (last_timestamp,source_table_name) VALUES (NULL,'view_promocoes@DBLINK_SADSB');
  34.       INSERT INTO t_info_extractions (last_timestamp,source_table_name) VALUES (NULL,'view_vendas@DBLINK_SADSB');
  35.       INSERT INTO t_info_extractions (last_timestamp,source_table_name) VALUES (NULL,'view_linhasvenda@DBLINK_SADSB');
  36.       INSERT INTO t_info_extractions (last_timestamp,source_table_name) VALUES (NULL,'view_linhasvenda_promocoes@DBLINK_SADSB');
  37.       INSERT INTO t_info_extractions (last_timestamp,source_table_name) VALUES (NULL,'view_clientes@DBLINK_SADSB');
  38.       pck_log.write_log('    Done!');
  39.    EXCEPTION
  40.       WHEN OTHERS THEN
  41.          pck_log.write_uncomplete_task_msg;
  42.          RAISE e_extraction;
  43.    END;
  44.  
  45.  
  46.  
  47.    -- ********************************************************************
  48.    -- *                     TABLE_EXTRACT                                *
  49.    -- *                                                                  *
  50.    -- * EXTRACT NEW AND CHANGED ROWS FROM SOURCE TABLE                   *
  51.    -- * IN                                                               *
  52.    -- *   p_source_table: the source table/view to use                   *
  53.    -- *   p_attributes_src: list of attributes to extract from           *
  54.    -- *   p_attributes_dest: list of attributes to fill                  *
  55.    -- *   p_dsa_table: name of the t_data_* table to fill                *
  56.    -- ********************************************************************
  57.   PROCEDURE table_extract (p_source_table VARCHAR2, p_DSA_table VARCHAR2, p_attributes_src VARCHAR2, p_attributes_dest VARCHAR2) IS
  58.       v_end_date TIMESTAMP;
  59.       v_start_date t_info_extractions.LAST_TIMESTAMP%TYPE;
  60.       v_sql  VARCHAR2(1000);
  61.    BEGIN
  62.       pck_log.write_log('  Extracting data ["TABLE_EXTRACT ('||UPPER(p_source_table)||')"]');
  63.       pck_log.rowcount(p_DSA_table,'Before');    -- Logs how many rows the destination table initially contains
  64.  
  65.       -- CLEAN DESTINATION TABLE
  66.       -- SOMETHING IS MISSING
  67.       v_sql:='DELETE FROM '||p_dsa_table;
  68.       pck_log.write_log(v_sql);
  69.       EXECUTE IMMEDIATE v_sql;
  70.  
  71.          --  find the date of change of the last record extracted in the previous extraction
  72.          v_sql:='SELECT last_timestamp FROM t_info_extractions WHERE UPPER(source_table_name)='''||UPPER(p_source_table)||'''';
  73.          EXECUTE IMMEDIATE v_sql INTO v_start_date;
  74.  
  75.          --    ---------------------
  76.          --   |   FISRT EXTRACTION  |
  77.          --    ---------------------
  78.         IF v_start_date IS NULL THEN
  79.  
  80.             -- FIND THE DATE OF CHANGE OF THE MOST RECENTLY CHANGED RECORD IN THE SOURCE TABLE
  81.             -- SOMETHING IS MISSING
  82.             v_sql:='SELECT MAX(src_last_changed) FROM '||p_source_table;
  83.             pck_log.write_log(v_sql);
  84.             EXECUTE IMMEDIATE v_sql INTO v_end_date;
  85.  
  86.  
  87.             -- EXTRACT ALL RELEVANT RECORDS FROM THE SOURCE TABLE TO THE DSA
  88.             -- SOMETHING IS MISSING
  89.             v_sql:='INSERT INTO '||p_DSA_table||' ('||p_attributes_dest||') SELECT '||p_attributes_src||
  90.             ' FROM '||p_source_table||' WHERE src_last_changed <= :xpto';
  91.             pck_log.write_log(v_sql);
  92.             EXECUTE IMMEDIATE v_sql USING v_end_date;
  93.  
  94.             -- UPDATE THE t_info_extractions TABLE
  95.             -- SOMETHING IS MISSING
  96.             -- UPDATE t_info_extractions
  97.             -- SET last_timestamp='2010-10-08'
  98.             -- WHERE UPPER(source_table_name) = 'VIEW_PRODUTOS@DBLINK_SADSB';
  99.             v_sql:='UPDATE t_info_extractions SET last_timestamp = :param WHERE UPPER(source_table_name)='''||UPPER(p_source_table)||'''';
  100.             pck_log.write_log(v_sql);
  101.             EXECUTE IMMEDIATE v_sql USING v_end_date;
  102.          ELSE
  103.          --    -------------------------------------
  104.          --   |  OTHER EXTRACTIONS AFTER THE FIRST  |
  105.          --    -------------------------------------
  106.             -- FIND THE DATE OF CHANGE OF THE MOST RECENTLY CHANGED RECORD IN THE SOURCE TABLE
  107.             -- SOMETHING IS MISSING
  108.             NULL;
  109.  
  110.             EXECUTE IMMEDIATE v_sql INTO v_end_date USING v_start_date;
  111.  
  112.             IF v_end_date>v_start_date THEN
  113.                -- EXTRACT ALL RELEVANT RECORDS FROM THE SOURCE TABLE TO THE DSA
  114.                -- SOMETHING IS MISSING
  115.                NULL;
  116.  
  117.                EXECUTE IMMEDIATE v_sql USING v_start_date, v_end_date;
  118.  
  119.                -- UPDATE THE t_info_extractions TABLE
  120.                -- SOMETHING IS MISSING
  121.                NULL;
  122.             END IF;
  123.          END IF;
  124.  
  125.       pck_log.write_log('    Done!');
  126.       pck_log.rowcount(p_DSA_table,'After');    -- Logs how many rows the destination table now contains
  127.    EXCEPTION
  128.       WHEN OTHERS THEN
  129.          pck_log.write_uncomplete_task_msg;
  130.          RAISE e_extraction;
  131.    END;
  132.  
  133.  
  134.    -- **************************************************************
  135.    -- *                       FILE_EXTRACT                         *
  136.    -- *                                                            *
  137.    -- * EXTRACT ROWS FROM SOURCE FILE                              *
  138.    -- * IN                                                         *
  139.    -- *    p_external_table: the external table to use             *
  140.    -- *    p_attributes_src: list of attributes to extract         *
  141.    -- *    p_attributes_dest: list of attributes to fill           *
  142.    -- *    p_dsa_table_new: name of the t_data_*_new table to fill *
  143.    -- *    p_dsa_table_old: name of the t_data_*_old table to fill *
  144.    -- **************************************************************
  145.    PROCEDURE file_extract (p_external_table VARCHAR2, p_attributes_src VARCHAR2, p_attributes_dest VARCHAR2, p_dsa_table_new VARCHAR2, p_dsa_table_old VARCHAR2) IS
  146.       v_sql  VARCHAR2(1000);
  147.    BEGIN
  148.       pck_log.write_log('  Extracting data ["FILE_EXTRACT ('||UPPER(p_external_table)||')"]');      
  149.       pck_log.rowcount(p_dsa_table_new,'Before');    -- Logs how many rows the destination table initially contains
  150.  
  151.       -- CLEAN _old TABLE (LIMPAR A TABELA_"OLD")
  152.       -- EXECUTE IMMEDIATE 'DELETE FROM '||p_dsa_table_old;
  153.       v_sql:='DELETE FROM '||p_dsa_table_old;
  154.       pck_log.write_log(v_sql);
  155.       EXECUTE IMMEDIATE v_sql;
  156.      
  157.       -- SOMETHING IS MISSING. THINK! (COPIAR DADOS DA TABELA_"NEW" PARA A TABELA_"OLD")
  158.       --EXECUTE IMMEDIATE 'INSERT INTO t_data_stores_old(a,b,c,d)
  159.       --SELECT a,b,c,d FROM t_data_stores_new' --Passar para dinâmico
  160.       -- EXECUTE IMMEDIATE 'INSERT INTO '||p_dsa_table_old||' ('||p_attributes_dest||')
  161.       -- SELECT '||p_attributes_dest||' FROM '||p_dsa_table_new;
  162.       v_sql:= 'INSERT INTO '||p_dsa_table_old||' ('||p_attributes_dest||')
  163.      SELECT '||p_attributes_dest||' FROM '||p_dsa_table_new;
  164.       pck_log.write_log(v_sql);
  165.       EXECUTE IMMEDIATE v_sql;
  166.      
  167.       --
  168.       -- QUANDO É DE TABELAS EXTERNAS É p_attributes_src AS NEW E OLD É p_attributes_dest
  169.       --
  170.  
  171.       -- SOMETHING IS MISSING. THINK HARDER! (LIMPAR TABELA_"NEW")
  172.       -- EXECUTE IMMEDIATE 'DELETE FROM '||p_dsa_table_new;
  173.       v_sql:= 'DELETE FROM '||p_dsa_table_new;
  174.       pck_log.write_log(v_sql);
  175.       EXECUTE IMMEDIATE v_sql;
  176.  
  177.       -- SOMETHING IS MISSING. THINK EVEN HARDER! (COPIAR DADOS DO FICHEIRO PARA TABELA_"NEW")
  178.       -- EXECUTE IMMEDIATE 'INSERT INTO '||p_dsa_table_new||' ('||p_attributes_dest||')
  179.       -- SELECT '||p_attributes_src||' FROM '||p_external_table;
  180.       v_sql:= 'INSERT INTO '||p_dsa_table_new||' ('||p_attributes_dest||')
  181.      SELECT '||p_attributes_src||' FROM '||p_external_table;
  182.       pck_log.write_log(v_sql);
  183.       EXECUTE IMMEDIATE v_sql;
  184.  
  185.       -- records the operation's SUCCESSFUL ending
  186.       pck_log.write_log('    Done!');
  187.       pck_log.rowcount(p_dsa_table_new,'After');    -- Logs how many rows the destination table now contains
  188.    EXCEPTION
  189.       WHEN OTHERS THEN
  190.          pck_log.write_uncomplete_task_msg;
  191.          RAISE e_extraction;
  192.    END;
  193.  
  194.  
  195.  
  196.    -- ********************************************************************
  197.    -- *                TABLE_EXTRACT_NON_INCREMENTAL                     *
  198.    -- *                                                                  *
  199.    -- * EXTRACT ROWS FROM SOURCE TABLE IN NON INCREMENTAL WAY            *
  200.    -- * IN: (same as table_extract)                                      *
  201.    -- ********************************************************************
  202.    PROCEDURE table_extract_non_incremental (p_source_table VARCHAR2, p_DSA_table VARCHAR2, p_attributes_src VARCHAR2, p_attributes_dest VARCHAR2) IS
  203.       v_sql  VARCHAR2(1000);
  204.    BEGIN
  205.       pck_log.write_log('  Extracting data ["TABLE_EXTRACT_NON_INCREMENTAL ('||UPPER(p_source_table)||')"]');
  206.       pck_log.rowcount(p_DSA_table,'Before');    -- Logs how many rows the destination table initially contains
  207.       -- LIMPAR A TABELA DESTINO
  208.       EXECUTE IMMEDIATE 'DELETE FROM '||p_DSA_table;
  209.  
  210.       -- extrair TODOS os registos da tabela fonte para a tabela correspondente na DSA
  211.       v_sql:='INSERT INTO '||p_DSA_table||'('|| p_attributes_dest||',rejected_by_screen) SELECT '||p_attributes_src||',''0'' FROM '||p_source_table;
  212.       EXECUTE IMMEDIATE v_sql;
  213.  
  214.       pck_log.write_log('    Done!');    
  215.       pck_log.rowcount(p_DSA_table,'After');    -- Logs how many rows the destination table now contains
  216.    EXCEPTION
  217.       WHEN OTHERS THEN
  218.          pck_log.write_uncomplete_task_msg;
  219.          RAISE e_extraction;
  220.    END;
  221.  
  222.  
  223.    PROCEDURE web_extract (p_src_link VARCHAR2, p_DSA_table VARCHAR2, p_src_attributes VARCHAR2, p_target_attributes VARCHAR2) IS
  224.       l_data CLOB;
  225.  
  226.       PROCEDURE store_json_data (p_data VARCHAR2, p_src_attributes VARCHAR2, p_target_attributes VARCHAR2, p_target_table VARCHAR2) IS
  227.          l_pos_inicial PLS_INTEGER;
  228.          l_pos_final PLS_INTEGER;
  229.          l_pos_atual_json PLS_INTEGER;
  230.          l_pos_final_registo PLS_INTEGER;
  231.          l_pos_atributo PLS_INTEGER;
  232.          l_pos_dados_inicial PLS_INTEGER;
  233.          l_pos_dados_final PLS_INTEGER;
  234.          l_registo VARCHAR2(1000);
  235.          l_atributo VARCHAR2(40);
  236.          v_sql VARCHAR2(500);
  237.          l_valores VARCHAR2(100);
  238.          l_pos_virgula  PLS_INTEGER;
  239.          l_string_to_parse  VARCHAR2(500) := p_src_attributes||',';
  240.          l_pos_atual_parse_src PLS_INTEGER;
  241.          l_aux PLS_INTEGER;
  242.       BEGIN
  243.          l_pos_inicial:= INSTR(l_data, '[');
  244.          l_pos_final:= INSTR(l_data, ']', l_pos_inicial);
  245.          l_pos_atual_json := l_pos_inicial;
  246.          /* ENQUANTO “]” não atingido FAZ */
  247.          LOOP
  248.             -- reinicia a lista de valores a inserir
  249.             l_valores:='';
  250.             l_pos_atual_json:=INSTR(l_data,'{',l_pos_atual_json);
  251.             -- termina quando não houver mais registos json para ler
  252.             EXIT WHEN l_pos_atual_json=0;
  253.  
  254.             l_pos_final_registo:=INSTR(l_data,'}',l_pos_atual_json);
  255.             -- lê o registo atual dos dados JSON
  256.             l_registo:=SUBSTR(l_data,l_pos_atual_json,l_pos_final_registo-l_pos_atual_json);
  257.             -- lê atributos solicitados, atualmente só 1 permitido
  258.             l_pos_atual_parse_src:=1;
  259.             l_aux:=0;
  260.             LOOP  -- faz o parse dos atributos origem, 1 a um; por cada um lê-o registo JSON
  261.                l_pos_virgula:=INSTR(l_string_to_parse,',',l_pos_atual_parse_src);
  262.                EXIT WHEN l_pos_virgula=0;
  263.                IF (l_aux>0) THEN
  264.                   l_valores:=l_valores||',';
  265.                END IF;
  266.                l_aux:=l_aux+1;
  267.                l_atributo:='"'||SUBSTR(l_string_to_parse,l_pos_atual_parse_src,l_pos_virgula-l_pos_atual_parse_src)||'": ';
  268.                l_pos_atual_parse_src:=l_pos_virgula+1;
  269.                -- procura o atributo dentro do registo JSON
  270.                l_pos_atributo:=INSTR(l_data,l_atributo,l_pos_atual_json);
  271.                IF (l_pos_atributo>0) THEN
  272.                   l_pos_dados_inicial:=l_pos_atributo+LENGTH(l_atributo);
  273.                   l_pos_dados_final:=INSTR(l_data,',',l_pos_dados_inicial);
  274.                   l_valores:=l_valores||REPLACE(SUBSTR(l_data,l_pos_dados_inicial,l_pos_dados_final-l_pos_dados_inicial),'"');
  275.                END IF;
  276.                -- stores the data into the target table          
  277.             END LOOP;   -- fim do parse dos atributos origem
  278.             l_pos_atual_json:=l_pos_final_registo;
  279.             v_sql:='INSERT INTO '||p_target_table||'('||p_target_attributes||') VALUES ('||l_valores||')';
  280.             EXECUTE IMMEDIATE v_sql;
  281.          END LOOP;
  282.       END;
  283.  
  284.    BEGIN
  285.       pck_log.write_log('  Extracting data ["WEB_EXTRACT ('||UPPER(p_src_link)||')"]');
  286.       pck_log.rowcount(p_DSA_table,'Before');    -- Logs how many rows the destination table initially contains
  287.       -- LIMPAR A TABELA DESTINO
  288.       EXECUTE IMMEDIATE 'DELETE FROM '||p_DSA_table;
  289.  
  290.       /* read the JSON data from the webpage */
  291.       l_data:=pck_utilities.read_web_data(p_src_link);
  292.  
  293.       /* parse the data to store the necessary data*/
  294.       store_json_data (l_data, p_src_attributes, p_target_attributes, p_DSA_table);
  295.  
  296.       pck_log.write_log('    Done!');    
  297.       pck_log.rowcount(p_DSA_table,'After');    -- Logs how many rows the destination table now contains
  298.    EXCEPTION
  299.       WHEN OTHERS THEN
  300.          pck_log.write_uncomplete_task_msg;
  301.          RAISE e_extraction;
  302.    END;
  303.  
  304.    -- ***************************************************************************************
  305.    -- *                                        MAIN                                         *
  306.    -- *                                                                                     *
  307.    -- * EXECUTES THE EXTRACTION PROCESS                                                     *
  308.    -- * IN                                                                                  *
  309.    -- *     p_initialize: TRUE=t_info_extractions will be cleaned and then filled           *
  310.    -- ***************************************************************************************
  311.    PROCEDURE main (p_initialize BOOLEAN) IS
  312.    BEGIN
  313.       pck_log.clean;
  314.       pck_log.write_log('*****  EXTRACT  EXTRACT  EXTRACT  EXTRACT  EXTRACT  EXTRACT  EXTRACT  *****');      -- DUPLICATES THE LAST ITERATION AND THE CORRESPONDING SCREEN SCHEDULE
  315.  
  316.       -- INITIALIZE THE EXTRACTION TABLE t_info_extractions
  317.       IF p_initialize = TRUE THEN
  318.          initialize_extractions_table(TRUE);
  319.       END IF;
  320.  
  321.       -- EXTRACT FROM SOURCE TABLES
  322.  
  323.       -- SOMETHING IS MISSING: maybe... a table extraction
  324.       table_extract('view_produtos@dblink_sadsb','t_data_products','src_id,src_name,src_brand,src_width,src_height,src_depth,src_pack_type,src_calories_100g,src_liq_weight,src_category_id','id,name,brand,width,height,depth,pack_type,calories_100g,liq_weight,category_id');
  325.       table_extract('view_linhasvenda@dblink_sadsb', 't_data_linesofsale', 'src_id,src_sale_id,src_product_id,src_quantity,src_ammount_paid,src_line_date', 'id,sale_id,product_id,quantity,ammount_paid,line_date');
  326.       table_extract('view_promocoes@dblink_sadsb', 't_data_promotions','src_id,src_name,src_start_date,src_end_date,src_reduction,src_on_outdoor,src_on_tv','id,name,start_date,end_date,reduction,on_outdoor,on_tv');
  327.       table_extract('view_linhasvenda_promocoes@dblink_sadsb', 't_data_linesofsalepromotions','src_line_id,src_promo_id','line_id,promo_id');
  328.       table_extract_non_incremental('view_categorias@dblink_sadsb', 't_data_categories', 'src_id,src_name', 'id,name');
  329.  
  330.       -- SOMETHING IS MISSING: maybe... a file extraction
  331.       file_extract ('t_ext_stores', 'name,refer,building,address,zip_code,city,district,phone_nrs,fax_nr,closure_date',
  332.                      'name,reference,building,address,zip_code,location,district,telephones,fax,closure_date','t_data_stores_new', 't_data_stores_old');
  333.       file_extract ('t_ext_managers', 'REFER_LOJA,MANAGER_NAME,HIRE_DATE',
  334.                      'REFERENCE,MANAGER_NAME,MANAGER_SINCE','t_data_managers_new', 't_data_managers_old');              
  335.  
  336.       -- now the web data
  337.       NULL;
  338.  
  339.       pck_log.write_log('  All extracted data commited to database.');
  340.    EXCEPTION
  341.       WHEN e_extraction THEN
  342.          pck_log.write_halt_msg;
  343.          ROLLBACK;
  344.       WHEN OTHERS THEN
  345.          ROLLBACK;
  346.          pck_log.write_uncomplete_task_msg;
  347.          pck_log.write_halt_msg;
  348.    END;
  349.  
  350. END pck_extract;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement