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(
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'

View File

@ -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,

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
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