Refresh view source table only when needed and for what is needed

This commit is contained in:
Jan Kvetina 2022-01-28 19:43:12 +01:00
parent d4e71a5ca8
commit 3e9dc71d3b
3 changed files with 71 additions and 18 deletions

View File

@ -770,7 +770,7 @@ wwv_flow_api.create_ig_report_column(
); );
wwv_flow_api.create_page_button( wwv_flow_api.create_page_button(
p_id=>wwv_flow_api.id(21547186191979378) 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_plug_id=>wwv_flow_api.id(14220162747378949)
,p_button_name=>'SEARCH' ,p_button_name=>'SEARCH'
,p_button_action=>'SUBMIT' ,p_button_action=>'SUBMIT'
@ -832,20 +832,22 @@ wwv_flow_api.create_page_button(
p_id=>wwv_flow_api.id(14930403398872313) p_id=>wwv_flow_api.id(14930403398872313)
,p_button_sequence=>40 ,p_button_sequence=>40
,p_button_plug_id=>wwv_flow_api.id(14220162747378949) ,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_static_id=>'BUTTON_REBUILD'
,p_button_action=>'REDIRECT_PAGE' ,p_button_action=>'REDIRECT_PAGE'
,p_button_template_options=>'#DEFAULT#' ,p_button_template_options=>'#DEFAULT#'
,p_button_template_id=>wwv_flow_api.id(9145249029569999) ,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_position=>'RIGHT_OF_TITLE'
,p_button_redirect_url=>'f?p=&APP_ID.:955:&SESSION.::&DEBUG.:955:P955_REBUILD:Y' ,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_button_cattributes=>'title="Rebuild USER_SOURCE_VIEWS table"'
,p_security_scheme=>wwv_flow_api.id(9556228749501966)
); );
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(14930610862872315) p_id=>wwv_flow_api.id(14930610862872315)
,p_name=>'P955_REBUILD' ,p_name=>'P955_REBUILD'
,p_item_sequence=>10 ,p_item_sequence=>30
,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_item_plug_id=>wwv_flow_api.id(14220162747378949)
,p_use_cache_before_default=>'NO' ,p_use_cache_before_default=>'NO'
,p_display_as=>'NATIVE_HIDDEN' ,p_display_as=>'NATIVE_HIDDEN'
@ -854,7 +856,7 @@ wwv_flow_api.create_page_item(
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(14931154674872320) p_id=>wwv_flow_api.id(14931154674872320)
,p_name=>'P955_VIEW_NAME' ,p_name=>'P955_VIEW_NAME'
,p_item_sequence=>20 ,p_item_sequence=>40
,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_item_plug_id=>wwv_flow_api.id(14220162747378949)
,p_display_as=>'NATIVE_HIDDEN' ,p_display_as=>'NATIVE_HIDDEN'
,p_attribute_01=>'Y' ,p_attribute_01=>'Y'
@ -862,7 +864,7 @@ wwv_flow_api.create_page_item(
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21457026534924150) p_id=>wwv_flow_api.id(21457026534924150)
,p_name=>'P955_SEARCH_VIEWS' ,p_name=>'P955_SEARCH_VIEWS'
,p_item_sequence=>30 ,p_item_sequence=>50
,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_item_plug_id=>wwv_flow_api.id(14220162747378949)
,p_prompt=>'View Like' ,p_prompt=>'View Like'
,p_display_as=>'NATIVE_TEXT_FIELD' ,p_display_as=>'NATIVE_TEXT_FIELD'
@ -880,7 +882,7 @@ wwv_flow_api.create_page_item(
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21540738826954401) p_id=>wwv_flow_api.id(21540738826954401)
,p_name=>'P955_SEARCH_SOURCE' ,p_name=>'P955_SEARCH_SOURCE'
,p_item_sequence=>50 ,p_item_sequence=>70
,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_item_plug_id=>wwv_flow_api.id(14220162747378949)
,p_prompt=>'Source Contains' ,p_prompt=>'Source Contains'
,p_display_as=>'NATIVE_TEXT_FIELD' ,p_display_as=>'NATIVE_TEXT_FIELD'
@ -898,7 +900,7 @@ wwv_flow_api.create_page_item(
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21540881630954402) p_id=>wwv_flow_api.id(21540881630954402)
,p_name=>'P955_SEARCH_COLUMNS' ,p_name=>'P955_SEARCH_COLUMNS'
,p_item_sequence=>40 ,p_item_sequence=>60
,p_item_plug_id=>wwv_flow_api.id(14220162747378949) ,p_item_plug_id=>wwv_flow_api.id(14220162747378949)
,p_prompt=>'Column Like' ,p_prompt=>'Column Like'
,p_display_as=>'NATIVE_TEXT_FIELD' ,p_display_as=>'NATIVE_TEXT_FIELD'
@ -916,7 +918,15 @@ wwv_flow_api.create_page_item(
wwv_flow_api.create_page_item( wwv_flow_api.create_page_item(
p_id=>wwv_flow_api.id(21540977667954403) p_id=>wwv_flow_api.id(21540977667954403)
,p_name=>'P955_SHOW_SEARCH' ,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_item_plug_id=>wwv_flow_api.id(14220162747378949)
,p_display_as=>'NATIVE_HIDDEN' ,p_display_as=>'NATIVE_HIDDEN'
,p_attribute_01=>'Y' ,p_attribute_01=>'Y'
@ -998,8 +1008,6 @@ wwv_flow_api.create_page_process(
'')) ''))
,p_process_clob_language=>'PLSQL' ,p_process_clob_language=>'PLSQL'
,p_error_display_location=>'INLINE_IN_NOTIFICATION' ,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( wwv_flow_api.create_page_process(
p_id=>wwv_flow_api.id(21558331173182171) p_id=>wwv_flow_api.id(21558331173182171)
@ -1017,6 +1025,9 @@ wwv_flow_api.create_page_process(
' :P955_VIEW_NAME := NULL;', ' :P955_VIEW_NAME := NULL;',
' :P955_SHOW_SEARCH := ''Y'';', ' :P955_SHOW_SEARCH := ''Y'';',
'END IF;', 'END IF;',
'',
'-- make button HOT, sometimes',
':P955_REFRESH_HOT := ''t-Button--hot'';',
'')) ''))
,p_process_clob_language=>'PLSQL' ,p_process_clob_language=>'PLSQL'
,p_error_display_location=>'INLINE_IN_NOTIFICATION' ,p_error_display_location=>'INLINE_IN_NOTIFICATION'

View File

@ -267,10 +267,15 @@ CREATE OR REPLACE PACKAGE app_actions AS
-- --
-- Refresh views source (convert views source to lines) -- 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 ( PROCEDURE clob_to_lines (
in_name VARCHAR2, in_name VARCHAR2,
in_clob CLOB, in_clob CLOB,

View File

@ -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 AS
PRAGMA AUTONOMOUS_TRANSACTION; 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 BEGIN
app.log_module(); app.log_module(CASE WHEN in_force THEN 'Y' END);
--
DELETE FROM user_source_views; -- 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 ( FOR c IN (
SELECT SELECT
v.view_name, v.view_name,
DBMS_METADATA.GET_DDL('VIEW', v.view_name) AS content DBMS_METADATA.GET_DDL('VIEW', v.view_name) AS content
FROM user_views v 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 ) 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*)', '')); app_actions.clob_to_lines(c.view_name, REGEXP_REPLACE(c.content, '^(\s*)', ''));
END LOOP; END LOOP;
-- --
COMMIT; 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(); app.log_success();
EXCEPTION EXCEPTION