Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.33 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. EXECUTE IMMEDIATE 'DELETE FROM ' || p_DSA_table;
  68.  
  69. -- find the date of change of the last record extracted in the previous extraction
  70. v_sql:='SELECT last_timestamp FROM t_info_extractions WHERE UPPER(source_table_name)='''||UPPER(p_source_table)||'''';
  71. EXECUTE IMMEDIATE v_sql INTO v_start_date;
  72.  
  73. -- ---------------------
  74. -- | FISRT EXTRACTION |
  75. -- ---------------------
  76. IF v_start_date IS NULL THEN
  77.  
  78. -- FIND THE DATE OF CHANGE OF THE MOST RECENTLY CHANGED RECORD IN THE SOURCE TABLE
  79. -- SOMETHING IS MISSING
  80. v_sql:= 'SELECT MAX(src_last_changed) FROM ' || p_source_table;
  81.  
  82. EXECUTE IMMEDIATE v_sql INTO v_end_date; -- seja guardado em
  83.  
  84.  
  85. -- EXTRACT ALL RELEVANT RECORDS FROM THE SOURCE TABLE TO THE DSA
  86. -- SOMETHING IS MISSING
  87. v_sql:= 'INSERT INTO' || p_DSA_table || '(' || p_attributes_dest || ')VALUES (SELECT ' || p_attributes_src || ' FROM ' || p_source_table || ' WHERE src_last_changed <= :1)';
  88. EXECUTE IMMEDIATE v_sql USING v_end_date; -- use (referencia com :1, restantes variaveis :2, :3)
  89.  
  90. -- UPDATE THE t_info_extractions TABLE
  91. -- SOMETHING IS MISSING
  92. v_sql:= 'UPDATE t_info_extractions SET last_timestamp = :1 WHERE source_table_name=''' || p_source_table || '''';
  93. EXECUTE IMMEDIATE v_sql USING v_end_date;
  94. ELSE
  95. -- -------------------------------------
  96. -- | OTHER EXTRACTIONS AFTER THE FIRST |
  97. -- -------------------------------------
  98. -- FIND THE DATE OF CHANGE OF THE MOST RECENTLY CHANGED RECORD IN THE SOURCE TABLE
  99. -- SOMETHING IS MISSING
  100. v_sql:= 'SELECT MAX(src_last_changed) FROM ' || p_source_table || 'WHERE src_last_changed >= :1';
  101. EXECUTE IMMEDIATE v_sql INTO v_end_date USING v_start_date;
  102.  
  103. IF v_end_date>v_start_date THEN
  104. -- EXTRACT ALL RELEVANT RECORDS FROM THE SOURCE TABLE TO THE DSA
  105. -- SOMETHING IS MISSING
  106. v_sql:= 'INSERT INTO' || p_DSA_table || '(' || p_attributes_dest || ')VALUES (SELECT ' || p_attributes_src || ' FROM ' || p_source_table || ' WHERE src_last_changed > :1 AND src_last_changed <= :2)';
  107. EXECUTE IMMEDIATE v_sql USING v_start_date, v_end_date;
  108.  
  109. -- UPDATE THE t_info_extractions TABLE
  110. -- SOMETHING IS MISSING
  111. v_sql:= 'UPDATE t_info_extractions SET last_timestamp = :1 WHERE source_table_name=''' || p_source_table || '''';
  112. EXECUTE IMMEDIATE v_sql USING v_end_date;
  113. END IF;
  114. END IF;
  115.  
  116. pck_log.write_log(' Done!');
  117. pck_log.rowcount(p_DSA_table,'After'); -- Logs how many rows the destination table now contains
  118. EXCEPTION
  119. WHEN OTHERS THEN
  120. pck_log.write_uncomplete_task_msg;
  121. RAISE e_extraction;
  122. END;
  123.  
  124.  
  125. -- **************************************************************
  126. -- * FILE_EXTRACT *
  127. -- * *
  128. -- * EXTRACT ROWS FROM SOURCE FILE *
  129. -- * IN *
  130. -- * p_external_table: the external table to use *
  131. -- * p_attributes_src: list of attributes to extract *
  132. -- * p_attributes_dest: list of attributes to fill *
  133. -- * p_dsa_table_new: name of the t_data_*_new table to fill *
  134. -- * p_dsa_table_old: name of the t_data_*_old table to fill *
  135. -- **************************************************************
  136. 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
  137. v_sql VARCHAR2(1000);
  138. BEGIN
  139. pck_log.write_log(' Extracting data ["FILE_EXTRACT ('||UPPER(p_external_table)||')"]');
  140. pck_log.rowcount(p_dsa_table_new,'Before'); -- Logs how many rows the destination table initially contains
  141.  
  142. -- CLEAN _old TABLE
  143. EXECUTE IMMEDIATE 'DELETE FROM '||p_dsa_table_old;
  144.  
  145. -- SOMETHING IS MISSING. THINK!
  146. -- novo -> antigo
  147. v_sql:='INSERT INTO '||p_dsa_table_old||'('|| p_attributes_dest||') SELECT '||p_attributes_dest||' FROM '||p_dsa_table_new;
  148. EXECUTE IMMEDIATE v_sql;
  149.  
  150. -- SOMETHING IS MISSING. THINK HARDER!
  151. -- delete novo
  152. EXECUTE IMMEDIATE 'DELETE FROM '||p_dsa_table_new;
  153.  
  154. -- SOMETHING IS MISSING. THINK EVEN HARDER!
  155. -- ext -> novo
  156. v_sql:='INSERT INTO '||p_dsa_table_new||'('|| p_attributes_dest||') SELECT '||p_attributes_src||' FROM '||p_external_table;
  157. EXECUTE IMMEDIATE v_sql;
  158.  
  159. -- records the operation's SUCCESSFUL ending
  160. pck_log.write_log(' Done!');
  161. pck_log.rowcount(p_dsa_table_new,'After'); -- Logs how many rows the destination table now contains
  162. EXCEPTION
  163. WHEN OTHERS THEN
  164. pck_log.write_uncomplete_task_msg;
  165. RAISE e_extraction;
  166. END;
  167.  
  168.  
  169.  
  170. -- ********************************************************************
  171. -- * TABLE_EXTRACT_NON_INCREMENTAL *
  172. -- * *
  173. -- * EXTRACT ROWS FROM SOURCE TABLE IN NON INCREMENTAL WAY *
  174. -- * IN: (same as table_extract) *
  175. -- ********************************************************************
  176. PROCEDURE table_extract_non_incremental (p_source_table VARCHAR2, p_DSA_table VARCHAR2, p_attributes_src VARCHAR2, p_attributes_dest VARCHAR2) IS
  177. v_sql VARCHAR2(1000);
  178. BEGIN
  179. pck_log.write_log(' Extracting data ["TABLE_EXTRACT_NON_INCREMENTAL ('||UPPER(p_source_table)||')"]');
  180. pck_log.rowcount(p_DSA_table,'Before'); -- Logs how many rows the destination table initially contains
  181. -- LIMPAR A TABELA DESTINO
  182. EXECUTE IMMEDIATE 'DELETE FROM '||p_DSA_table;
  183.  
  184. -- extrair TODOS os registos da tabela fonte para a tabela correspondente na DSA
  185. v_sql:='INSERT INTO '||p_DSA_table||'('|| p_attributes_dest||',rejected_by_screen) SELECT '||p_attributes_src||',''0'' FROM '||p_source_table;
  186. EXECUTE IMMEDIATE v_sql;
  187.  
  188. pck_log.write_log(' Done!');
  189. pck_log.rowcount(p_DSA_table,'After'); -- Logs how many rows the destination table now contains
  190. EXCEPTION
  191. WHEN OTHERS THEN
  192. pck_log.write_uncomplete_task_msg;
  193. RAISE e_extraction;
  194. END;
  195.  
  196.  
  197. PROCEDURE web_extract (p_src_link VARCHAR2, p_DSA_table VARCHAR2, p_src_attributes VARCHAR2, p_target_attributes VARCHAR2) IS
  198. l_data CLOB;
  199.  
  200. PROCEDURE store_json_data (p_data VARCHAR2, p_src_attributes VARCHAR2, p_target_attributes VARCHAR2, p_target_table VARCHAR2) IS
  201. l_pos_inicial PLS_INTEGER;
  202. l_pos_final PLS_INTEGER;
  203. l_pos_atual_json PLS_INTEGER;
  204. l_pos_final_registo PLS_INTEGER;
  205. l_pos_atributo PLS_INTEGER;
  206. l_pos_dados_inicial PLS_INTEGER;
  207. l_pos_dados_final PLS_INTEGER;
  208. l_registo VARCHAR2(1000);
  209. l_atributo VARCHAR2(40);
  210. v_sql VARCHAR2(500);
  211. l_valores VARCHAR2(100);
  212. l_pos_virgula PLS_INTEGER;
  213. l_string_to_parse VARCHAR2(500) := p_src_attributes||',';
  214. l_pos_atual_parse_src PLS_INTEGER;
  215. l_aux PLS_INTEGER;
  216. BEGIN
  217. l_pos_inicial:= instr(l_data, '[');
  218. l_pos_final:= instr(l_data, ']', l_pos_inicial);
  219. l_pos_atual_json := l_pos_inicial;
  220. /* ENQUANTO “]” não atingido FAZ */
  221. LOOP
  222. -- reinicia a lista de valores a inserir
  223. l_valores:='';
  224. l_pos_atual_json:=instr(l_data,'{',l_pos_atual_json);
  225. -- termina quando não houver mais registos json para ler
  226. EXIT WHEN l_pos_atual_json=0;
  227.  
  228. l_pos_final_registo:=instr(l_data,'}',l_pos_atual_json);
  229. -- lê o registo atual dos dados JSON
  230. l_registo:=substr(l_data,l_pos_atual_json,l_pos_final_registo-l_pos_atual_json);
  231. -- lê atributos solicitados, atualmente só 1 permitido
  232. l_pos_atual_parse_src:=1;
  233. l_aux:=0;
  234. LOOP -- faz o parse dos atributos origem, 1 a um; por cada um lê-o registo JSON
  235. l_pos_virgula:=INSTR(l_string_to_parse,',',l_pos_atual_parse_src);
  236. EXIT WHEN l_pos_virgula=0;
  237. IF (l_aux>0) THEN
  238. l_valores:=l_valores||',';
  239. END IF;
  240. l_aux:=l_aux+1;
  241. l_atributo:='"'||SUBSTR(l_string_to_parse,l_pos_atual_parse_src,l_pos_virgula-l_pos_atual_parse_src)||'": ';
  242. l_pos_atual_parse_src:=l_pos_virgula+1;
  243. -- procura o atributo dentro do registo JSON
  244. l_pos_atributo:=instr(l_data,l_atributo,l_pos_atual_json);
  245. IF (l_pos_atributo>0) THEN
  246. l_pos_dados_inicial:=l_pos_atributo+length(l_atributo);
  247. l_pos_dados_final:=instr(l_data,',',l_pos_dados_inicial);
  248. l_valores:=l_valores||REPLACE(substr(l_data,l_pos_dados_inicial,l_pos_dados_final-l_pos_dados_inicial),'"');
  249. END IF;
  250. -- stores the data into the target table
  251. END LOOP; -- fim do parse dos atributos origem
  252. l_pos_atual_json:=l_pos_final_registo;
  253. v_sql:='INSERT INTO '||p_target_table||'('||p_target_attributes||') VALUES ('||l_valores||')';
  254. EXECUTE IMMEDIATE v_sql;
  255. END LOOP;
  256. END;
  257.  
  258. BEGIN
  259. pck_log.write_log(' Extracting data ["WEB_EXTRACT ('||UPPER(p_src_link)||')"]');
  260. pck_log.rowcount(p_DSA_table,'Before'); -- Logs how many rows the destination table initially contains
  261. -- LIMPAR A TABELA DESTINO
  262. EXECUTE IMMEDIATE 'DELETE FROM '||p_DSA_table;
  263.  
  264. /* read the JSON data from the webpage */
  265. l_data:=pck_utilities.read_web_data(p_src_link);
  266.  
  267. /* parse the data to store the necessary data*/
  268. store_json_data (l_data, p_src_attributes, p_target_attributes, p_DSA_table);
  269.  
  270. pck_log.write_log(' Done!');
  271. pck_log.rowcount(p_DSA_table,'After'); -- Logs how many rows the destination table now contains
  272. EXCEPTION
  273. WHEN OTHERS THEN
  274. pck_log.write_uncomplete_task_msg;
  275. RAISE e_extraction;
  276. END;
  277.  
  278. -- ***************************************************************************************
  279. -- * MAIN *
  280. -- * *
  281. -- * EXECUTES THE EXTRACTION PROCESS *
  282. -- * IN *
  283. -- * p_initialize: TRUE=t_info_extractions will be cleaned and then filled *
  284. -- ***************************************************************************************
  285. PROCEDURE main (p_initialize BOOLEAN) IS
  286. BEGIN
  287. pck_log.clean;
  288. pck_log.write_log('***** EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT *****'); -- DUPLICATES THE LAST ITERATION AND THE CORRESPONDING SCREEN SCHEDULE
  289.  
  290. -- INITIALIZE THE EXTRACTION TABLE t_info_extractions
  291. IF p_initialize = TRUE THEN
  292. initialize_extractions_table(TRUE);
  293. END IF;
  294.  
  295. -- EXTRACT FROM SOURCE TABLES
  296.  
  297. -- SOMETHING IS MISSING: maybe... a table extraction
  298. /* table_extract('view_vendas@dblink_sadsb','t_data_sales','src_id,src_sale_date,src_store_id,src_customer_id','id,sale_date,store_id,customer_id');
  299. table_extract('view_clientes@dblink_sadsb','t_data_clients','src_cod_cliente, src_numero_cartao, src_nome, src_morada, src_localidade, src_distrito, src_codigo_postal, src_telefone, src_sexo, src_idade, src_estado_civil','id,card_number,name,address,location,district,zip_code,phone_nr,gender,age,marital_status');
  300. -- null;
  301. 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');
  302. 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');
  303. 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');
  304. table_extract('view_linhasvenda_promocoes@dblink_sadsb', 't_data_linesofsalepromotions','src_line_id,src_promo_id','line_id,promo_id');
  305. table_extract_non_incremental('view_categorias@dblink_sadsb', 't_data_categories', 'src_id,src_name', 'id,name');
  306. */
  307. -- SOMETHING IS MISSING: maybe... a file extraction
  308. file_extract ('t_ext_stores', 'name,refer,building,address,zip_code,city,district,phone_nrs,fax_nr,closure_date',
  309. 'name,reference,building,address,zip_code,location,district,telephones,fax,closure_date','t_data_stores_new', 't_data_stores_old');
  310. --null;
  311. file_extract ('t_ext_managers', 'store_refer, name, hiring_date',
  312. 'reference,manager_name, manager_since','t_data_managers_new', 't_data_managers_old');
  313.  
  314.  
  315. -- now the web data
  316. -- null;
  317. -- web_extract ('http://api.ipma.pt/open-data/forecast/meteorology/cities/daily/hp-daily-forecast-day0.json', 't_data_celsius',
  318. -- 'forecastDate, globalIdLocal, tMin, tMax', 'forecast_date, id_local, t_min, t_max');
  319.  
  320. pck_log.write_log(' All extracted data commited to database.');
  321. EXCEPTION
  322. WHEN e_extraction THEN
  323. pck_log.write_halt_msg;
  324. ROLLBACK;
  325. WHEN OTHERS THEN
  326. ROLLBACK;
  327. pck_log.write_uncomplete_task_msg;
  328. pck_log.write_halt_msg;
  329. END;
  330.  
  331. END pck_extract;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement