From 3e9dc71d3b1f40b9b98edab1f4707afed1cb03b6 Mon Sep 17 00:00:00 2001 From: Jan Kvetina Date: Fri, 28 Jan 2022 19:43:12 +0100 Subject: [PATCH] Refresh view source table only when needed and for what is needed --- apex/f770/application/pages/page_00955.sql | 33 ++++++++++----- packages/app_actions.spec.sql | 7 +++- packages/app_actions.sql | 49 +++++++++++++++++++--- 3 files changed, 71 insertions(+), 18 deletions(-) diff --git a/apex/f770/application/pages/page_00955.sql b/apex/f770/application/pages/page_00955.sql index 9e2cfee..b7506b0 100644 --- a/apex/f770/application/pages/page_00955.sql +++ b/apex/f770/application/pages/page_00955.sql @@ -770,7 +770,7 @@ wwv_flow_api.create_ig_report_column( ); wwv_flow_api.create_page_button( p_id=>wwv_flow_api.id(21547186191979378) -,p_button_sequence=>50 +,p_button_sequence=>80 ,p_button_plug_id=>wwv_flow_api.id(14220162747378949) ,p_button_name=>'SEARCH' ,p_button_action=>'SUBMIT' @@ -832,20 +832,22 @@ wwv_flow_api.create_page_button( p_id=>wwv_flow_api.id(14930403398872313) ,p_button_sequence=>40 ,p_button_plug_id=>wwv_flow_api.id(14220162747378949) -,p_button_name=>'REBUILD' +,p_button_name=>'REFRESH_VIEWS' ,p_button_static_id=>'BUTTON_REBUILD' ,p_button_action=>'REDIRECT_PAGE' ,p_button_template_options=>'#DEFAULT#' ,p_button_template_id=>wwv_flow_api.id(9145249029569999) -,p_button_image_alt=>'Rebuild' +,p_button_image_alt=>'Refresh Views' ,p_button_position=>'RIGHT_OF_TITLE' ,p_button_redirect_url=>'f?p=&APP_ID.:955:&SESSION.::&DEBUG.:955:P955_REBUILD:Y' +,p_button_css_classes=>'&P955_REFRESH_HOT.' ,p_button_cattributes=>'title="Rebuild USER_SOURCE_VIEWS table"' +,p_security_scheme=>wwv_flow_api.id(9556228749501966) ); wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(14930610862872315) ,p_name=>'P955_REBUILD' -,p_item_sequence=>10 +,p_item_sequence=>30 ,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_use_cache_before_default=>'NO' ,p_display_as=>'NATIVE_HIDDEN' @@ -854,7 +856,7 @@ wwv_flow_api.create_page_item( wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(14931154674872320) ,p_name=>'P955_VIEW_NAME' -,p_item_sequence=>20 +,p_item_sequence=>40 ,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_display_as=>'NATIVE_HIDDEN' ,p_attribute_01=>'Y' @@ -862,7 +864,7 @@ wwv_flow_api.create_page_item( wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(21457026534924150) ,p_name=>'P955_SEARCH_VIEWS' -,p_item_sequence=>30 +,p_item_sequence=>50 ,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_prompt=>'View Like' ,p_display_as=>'NATIVE_TEXT_FIELD' @@ -880,7 +882,7 @@ wwv_flow_api.create_page_item( wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(21540738826954401) ,p_name=>'P955_SEARCH_SOURCE' -,p_item_sequence=>50 +,p_item_sequence=>70 ,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_prompt=>'Source Contains' ,p_display_as=>'NATIVE_TEXT_FIELD' @@ -898,7 +900,7 @@ wwv_flow_api.create_page_item( wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(21540881630954402) ,p_name=>'P955_SEARCH_COLUMNS' -,p_item_sequence=>40 +,p_item_sequence=>60 ,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_prompt=>'Column Like' ,p_display_as=>'NATIVE_TEXT_FIELD' @@ -916,7 +918,15 @@ wwv_flow_api.create_page_item( wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(21540977667954403) ,p_name=>'P955_SHOW_SEARCH' -,p_item_sequence=>60 +,p_item_sequence=>10 +,p_item_plug_id=>wwv_flow_api.id(14220162747378949) +,p_display_as=>'NATIVE_HIDDEN' +,p_attribute_01=>'Y' +); +wwv_flow_api.create_page_item( + p_id=>wwv_flow_api.id(21543913787954433) +,p_name=>'P955_REFRESH_HOT' +,p_item_sequence=>20 ,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_display_as=>'NATIVE_HIDDEN' ,p_attribute_01=>'Y' @@ -998,8 +1008,6 @@ wwv_flow_api.create_page_process( '')) ,p_process_clob_language=>'PLSQL' ,p_error_display_location=>'INLINE_IN_NOTIFICATION' -,p_process_when=>'P955_REBUILD' -,p_process_when_type=>'ITEM_IS_NOT_NULL' ); wwv_flow_api.create_page_process( p_id=>wwv_flow_api.id(21558331173182171) @@ -1017,6 +1025,9 @@ wwv_flow_api.create_page_process( ' :P955_VIEW_NAME := NULL;', ' :P955_SHOW_SEARCH := ''Y'';', 'END IF;', +'', +'-- make button HOT, sometimes', +':P955_REFRESH_HOT := ''t-Button--hot'';', '')) ,p_process_clob_language=>'PLSQL' ,p_error_display_location=>'INLINE_IN_NOTIFICATION' diff --git a/packages/app_actions.spec.sql b/packages/app_actions.spec.sql index c69fdb0..0cac984 100644 --- a/packages/app_actions.spec.sql +++ b/packages/app_actions.spec.sql @@ -267,10 +267,15 @@ CREATE OR REPLACE PACKAGE app_actions AS -- -- Refresh views source (convert views source to lines) -- - PROCEDURE refresh_user_source_views; + PROCEDURE refresh_user_source_views ( + in_force BOOLEAN := FALSE + ); + -- + -- Convert VIEW content (LONG) to lines in user_source_view table + -- PROCEDURE clob_to_lines ( in_name VARCHAR2, in_clob CLOB, diff --git a/packages/app_actions.sql b/packages/app_actions.sql index 482e23e..8b77ce8 100644 --- a/packages/app_actions.sql +++ b/packages/app_actions.sql @@ -748,25 +748,62 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS - PROCEDURE refresh_user_source_views + PROCEDURE refresh_user_source_views ( + in_force BOOLEAN := FALSE + ) AS PRAGMA AUTONOMOUS_TRANSACTION; + -- + in_table_name CONSTANT user_objects.object_name%TYPE := 'USER_SOURCE_VIEWS'; + -- + v_table_time user_objects.last_ddl_time%TYPE; + v_views_time user_objects.last_ddl_time%TYPE; BEGIN - app.log_module(); - -- - DELETE FROM user_source_views; - -- + app.log_module(CASE WHEN in_force THEN 'Y' END); + + -- compare timestamps + IF NOT in_force THEN + SELECT o.last_ddl_time INTO v_table_time + FROM user_objects o + WHERE o.object_name = in_table_name + AND o.object_type = 'TABLE'; + -- + SELECT MAX(o.last_ddl_time) INTO v_views_time + FROM user_objects o + WHERE o.object_type = 'VIEW'; + + -- refresh not needed + IF v_table_time > v_views_time THEN + app.log_result('SKIPPING'); + RETURN; + END IF; + ELSE + -- in force mode cleanup whole table + DELETE FROM user_source_views; -- truncate? + END IF; + + -- refresh table content FOR c IN ( SELECT v.view_name, DBMS_METADATA.GET_DDL('VIEW', v.view_name) AS content FROM user_views v + JOIN user_objects o + ON o.object_name = v.view_name + AND o.object_type = 'VIEW' + AND (o.last_ddl_time >= v_table_time OR v_table_time IS NULL) ) LOOP - DBMS_OUTPUT.PUT_LINE(c.view_name); + DELETE FROM user_source_views t + WHERE t.name = c.view_name; + -- app_actions.clob_to_lines(c.view_name, REGEXP_REPLACE(c.content, '^(\s*)', '')); END LOOP; -- COMMIT; + + -- alter table to update last refresh date + EXECUTE IMMEDIATE 'ALTER TABLE ' || in_table_name || ' ADD tmp_col NUMBER'; + EXECUTE IMMEDIATE 'ALTER TABLE ' || in_table_name || ' DROP COLUMN tmp_col'; -- app.log_success(); EXCEPTION