Views cleanup, show # of referenced objects

This commit is contained in:
Jan Kvetina 2022-01-31 21:20:24 +01:00
parent 551a2937a3
commit d8f60cb343
6 changed files with 190 additions and 159 deletions

View File

@ -200,7 +200,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'Readonly'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>100
,p_display_sequence=>110
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(16023054809727215)
,p_use_group_for=>'BOTH'
@ -231,7 +231,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_DISPLAY_ONLY'
,p_heading=>'Last Ddl Time'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>130
,p_display_sequence=>140
,p_value_alignment=>'CENTER'
,p_attribute_02=>'VALUE'
,p_attribute_05=>'PLAIN'
@ -285,7 +285,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_SINGLE_CHECKBOX'
,p_heading=>'Definer'
,p_heading_alignment=>'CENTER'
,p_display_sequence=>110
,p_display_sequence=>120
,p_value_alignment=>'CENTER'
,p_group_id=>wwv_flow_api.id(16023054809727215)
,p_use_group_for=>'BOTH'
@ -398,7 +398,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_DISPLAY_ONLY'
,p_heading=>'Comments'
,p_heading_alignment=>'LEFT'
,p_display_sequence=>120
,p_display_sequence=>130
,p_value_alignment=>'LEFT'
,p_attribute_02=>'VALUE'
,p_attribute_05=>'PLAIN'
@ -450,7 +450,7 @@ wwv_flow_api.create_region_column(
,p_item_type=>'NATIVE_DISPLAY_ONLY'
,p_heading=>'List Columns'
,p_heading_alignment=>'LEFT'
,p_display_sequence=>90
,p_display_sequence=>100
,p_value_alignment=>'LEFT'
,p_attribute_02=>'VALUE'
,p_attribute_05=>'PLAIN'
@ -465,6 +465,33 @@ wwv_flow_api.create_region_column(
,p_is_primary_key=>false
,p_include_in_export=>true
);
wwv_flow_api.create_region_column(
p_id=>wwv_flow_api.id(22085867103580626)
,p_name=>'COUNT_REFERENCES'
,p_source_type=>'DB_COLUMN'
,p_source_expression=>'COUNT_REFERENCES'
,p_data_type=>'NUMBER'
,p_is_query_only=>false
,p_item_type=>'NATIVE_DISPLAY_ONLY'
,p_heading=>'Count'
,p_heading_alignment=>'RIGHT'
,p_display_sequence=>90
,p_value_alignment=>'RIGHT'
,p_group_id=>wwv_flow_api.id(15339776986749829)
,p_use_group_for=>'BOTH'
,p_attribute_02=>'VALUE'
,p_attribute_05=>'PLAIN'
,p_enable_filter=>true
,p_filter_is_required=>false
,p_filter_lov_type=>'NONE'
,p_use_as_row_header=>false
,p_enable_sort_group=>true
,p_enable_control_break=>true
,p_enable_hide=>true
,p_is_primary_key=>false
,p_duplicate_value=>true
,p_include_in_export=>true
);
wwv_flow_api.create_interactive_grid(
p_id=>wwv_flow_api.id(14929214006872301)
,p_internal_uid=>14929214006872301
@ -543,7 +570,7 @@ wwv_flow_api.create_ig_report_column(
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(14938205769877740)
,p_view_id=>wwv_flow_api.id(14935014538877722)
,p_display_seq=>9
,p_display_seq=>10
,p_column_id=>wwv_flow_api.id(14929621363872305)
,p_is_visible=>false
,p_is_frozen=>false
@ -552,7 +579,7 @@ wwv_flow_api.create_ig_report_column(
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(14940055040877744)
,p_view_id=>wwv_flow_api.id(14935014538877722)
,p_display_seq=>12
,p_display_seq=>13
,p_column_id=>wwv_flow_api.id(14929897471872307)
,p_is_visible=>true
,p_is_frozen=>false
@ -569,7 +596,7 @@ wwv_flow_api.create_ig_report_column(
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(14965446688031898)
,p_view_id=>wwv_flow_api.id(14935014538877722)
,p_display_seq=>10
,p_display_seq=>11
,p_column_id=>wwv_flow_api.id(14930051725872309)
,p_is_visible=>false
,p_is_frozen=>false
@ -608,7 +635,7 @@ wwv_flow_api.create_ig_report_column(
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(16643570436750208)
,p_view_id=>wwv_flow_api.id(14935014538877722)
,p_display_seq=>11
,p_display_seq=>12
,p_column_id=>wwv_flow_api.id(16466877978696716)
,p_is_visible=>false
,p_is_frozen=>false
@ -625,11 +652,20 @@ wwv_flow_api.create_ig_report_column(
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(21563306768800463)
,p_view_id=>wwv_flow_api.id(14935014538877722)
,p_display_seq=>8
,p_display_seq=>9
,p_column_id=>wwv_flow_api.id(21541103407954405)
,p_is_visible=>false
,p_is_frozen=>false
);
wwv_flow_api.create_ig_report_column(
p_id=>wwv_flow_api.id(22266916860170945)
,p_view_id=>wwv_flow_api.id(14935014538877722)
,p_display_seq=>8
,p_column_id=>wwv_flow_api.id(22085867103580626)
,p_is_visible=>true
,p_is_frozen=>false
,p_width=>80
);
wwv_flow_api.create_ig_report(
p_id=>wwv_flow_api.id(36527039231747011)
,p_interactive_grid_id=>wwv_flow_api.id(14929214006872301)
@ -1004,7 +1040,7 @@ wwv_flow_api.create_page_process(
,p_process_type=>'NATIVE_PLSQL'
,p_process_name=>'ACTION_REFRESH_VIEWS_SOURCE'
,p_process_sql_clob=>wwv_flow_string.join(wwv_flow_t_varchar2(
'app_actions.refresh_user_source_views();',
'app.refresh_user_source_views();',
''))
,p_process_clob_language=>'PLSQL'
,p_error_display_location=>'INLINE_IN_NOTIFICATION'

View File

@ -1279,6 +1279,20 @@ CREATE OR REPLACE PACKAGE app AS
--
-- Refresh views source (convert views source from LONG to searchable lines)
--
PROCEDURE refresh_user_source_views (
in_view_name VARCHAR2 := NULL,
in_force BOOLEAN := FALSE
);
-- ### Custom wrappers
--

View File

@ -2954,6 +2954,128 @@ CREATE OR REPLACE PACKAGE BODY app AS
PROCEDURE refresh_user_source_views (
in_view_name VARCHAR2 := NULL,
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;
--
PROCEDURE clob_to_lines (
in_name VARCHAR2,
in_clob CLOB,
in_offset NUMBER := NULL
)
AS
clob_len PLS_INTEGER := DBMS_LOB.GETLENGTH(in_clob);
clob_line PLS_INTEGER := 1;
offset PLS_INTEGER := 1;
amount PLS_INTEGER := 32767;
buffer VARCHAR2(32767);
BEGIN
WHILE offset < clob_len LOOP
IF INSTR(in_clob, CHR(10), offset) = 0 THEN
amount := clob_len - offset + 1;
ELSE
amount := INSTR(in_clob, CHR(10), offset) - offset;
END IF;
--
IF amount = 0 THEN
buffer := '';
ELSE
DBMS_LOB.READ(in_clob, amount, offset, buffer);
END IF;
--
-- @TODO: CREATE & RETURN COLLECTION INSTEAD
--
IF clob_line > 1 THEN
INSERT INTO user_source_views (name, line, text)
VALUES (
in_name,
clob_line - 1 - NVL(in_offset, 0),
REPLACE(REPLACE(CASE WHEN clob_line = 2 THEN LTRIM(buffer) ELSE buffer END, CHR(13), ''), CHR(10), '')
);
END IF;
--
clob_line := clob_line + 1;
IF INSTR(in_clob, CHR(10), offset) = clob_len THEN
buffer := '';
END IF;
--
offset := offset + amount + 1;
END LOOP;
END;
BEGIN
app.log_module(in_view_name, 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
DELETE FROM user_source_views t
WHERE t.name = c.view_name;
--
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
WHEN app.app_exception THEN
ROLLBACK;
RAISE;
WHEN OTHERS THEN
ROLLBACK;
app.raise_error();
END;
-- ### Dynamic procedure call
--
--
-- @TODO:
--

View File

@ -301,33 +301,6 @@ CREATE OR REPLACE PACKAGE app_actions AS
-- ### Views source table
--
--
-- Refresh views source (convert views source to lines)
--
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,
in_offset NUMBER := NULL
);
-- ### E-mails
--

View File

@ -844,122 +844,6 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
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(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
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
WHEN app.app_exception THEN
ROLLBACK;
RAISE;
WHEN OTHERS THEN
ROLLBACK;
app.raise_error();
END;
PROCEDURE clob_to_lines (
in_name VARCHAR2,
in_clob CLOB,
in_offset NUMBER := NULL
)
AS
clob_len PLS_INTEGER := DBMS_LOB.GETLENGTH(in_clob);
clob_line PLS_INTEGER := 1;
offset PLS_INTEGER := 1;
amount PLS_INTEGER := 32767;
buffer VARCHAR2(32767);
BEGIN
WHILE offset < clob_len LOOP
IF INSTR(in_clob, CHR(10), offset) = 0 THEN
amount := clob_len - offset + 1;
ELSE
amount := INSTR(in_clob, CHR(10), offset) - offset;
END IF;
--
IF amount = 0 THEN
buffer := '';
ELSE
DBMS_LOB.READ(in_clob, amount, offset, buffer);
END IF;
--
-- @TODO: CREATE & RETURN COLLECTION INSTEAD
--
IF clob_line > 1 THEN
INSERT INTO user_source_views (name, line, text)
VALUES (
in_name,
clob_line - 1 - NVL(in_offset, 0),
REPLACE(REPLACE(CASE WHEN clob_line = 2 THEN LTRIM(buffer) ELSE buffer END, CHR(13), ''), CHR(10), '')
);
END IF;
--
clob_line := clob_line + 1;
IF INSTR(in_clob, CHR(10), offset) = clob_len THEN
buffer := '';
END IF;
--
offset := offset + amount + 1;
END LOOP;
END;
FUNCTION clob_to_blob (
in_clob CLOB
)

View File

@ -12,7 +12,9 @@ WITH x AS (
),
r AS (
SELECT
d.name AS view_name,
d.name AS view_name,
--
NULLIF(SUM(CASE WHEN d.referenced_type IN ('TABLE', 'VIEW') THEN 1 ELSE 0 END), 0) AS count_references,
--
LISTAGG(CASE WHEN d.referenced_type = 'TABLE'
THEN app_actions.get_html_a(app_actions.get_object_link(d.referenced_type, d.referenced_name), d.referenced_name) END, ', ')
@ -32,7 +34,7 @@ r AS (
),
u AS (
SELECT
d.referenced_name AS view_name,
d.referenced_name AS view_name,
--
LISTAGG(app_actions.get_html_a(app_actions.get_object_link(d.type, d.name), d.name), ', ')
WITHIN GROUP (ORDER BY d.name) AS used_in_objects
@ -81,9 +83,8 @@ v AS (
),
c AS (
SELECT
c.table_name AS view_name,
--
COUNT(c.column_name) AS count_columns,
c.table_name AS view_name,
COUNT(c.column_name) AS count_columns,
--
LOWER(LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.column_id)) AS list_columns,
--
@ -115,6 +116,7 @@ SELECT
p.used_on_pages,
r.referenced_tables,
r.referenced_views,
r.count_references,
--
NULLIF(v.read_only, 'N') AS is_readonly,
CASE WHEN v.bequeath = 'DEFINER' THEN 'Y' END AS is_definer,