Compare commits

...

17 Commits
main ... 2023

Author SHA1 Message Date
Jan Kvetina
eeffe12c9a Escape inputs 2023-01-27 19:46:55 +01:00
Jan Kvetina
67bb97ae8a Filters 2023-01-27 19:42:44 +01:00
Jan Kvetina
3ba440705e Prep for persistent items (again) 2022-12-11 21:29:07 +01:00
Jan Kvetina
cc9429c3e1 Table for colors 2022-12-11 21:28:50 +01:00
Jan Kvetina
2418416b9a Extend data types 2022-12-11 21:28:39 +01:00
Jan Kvetina
728f3baf97 Fix source 2022-12-11 20:37:51 +01:00
Jan Kvetina
50ebe0180d Leave this out for a dedicated app 2022-12-11 20:37:41 +01:00
Jan Kvetina
fb702e6702 Use MVs in Top navigation 2022-12-11 20:23:15 +01:00
Jan Kvetina
f878e6865b Rename Source, merge all in one table, @TODO 2022-12-11 20:21:51 +01:00
Jan Kvetina
34871a7dfc Remove, we will try without 2022-12-11 20:21:13 +01:00
Jan Kvetina
e7c8ab53a2 Rename table 2022-12-11 20:20:43 +01:00
Jan Kvetina
0536ece55a Make it callable from SQL 2022-12-11 20:20:01 +01:00
Jan Kvetina
1648d5dc8a Cleanup MVWs for navigation 2022-12-11 20:18:42 +01:00
Jan Kvetina
2bb36d612e Pass args from MVW 2022-12-11 20:17:57 +01:00
Jan Kvetina
6c2e24f48e Simplify refresh 2022-12-11 20:15:53 +01:00
Jan Kvetina
9bd06fdd55 Rename view 2022-12-11 20:14:25 +01:00
Jan Kvetina
54ab201504 Missing user grant 2022-12-11 20:14:01 +01:00
59 changed files with 333 additions and 1968 deletions

View File

@ -14,6 +14,7 @@ GRANT CREATE TRIGGER TO core;
GRANT CREATE SEQUENCE TO core;
GRANT CREATE PROCEDURE TO core;
GRANT CREATE JOB TO core;
GRANT CREATE SYNONYM TO core;
--
--GRANT EXECUTE ON DBMS_EPG TO core;
--GRANT EXECUTE ON DBMS_CRYPTO TO core;

View File

@ -1,58 +0,0 @@
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP MATERIALIZED VIEW NAV_AVAILABILITY_MVW');
DBMS_OUTPUT.PUT_LINE('--');
DBMS_OUTPUT.PUT_LINE('-- MATERIALIZED VIEW NAV_AVAILABILITY_MVW DROPPED');
DBMS_OUTPUT.PUT_LINE('--');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
--
CREATE MATERIALIZED VIEW nav_availability_mvw
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
AS
WITH w AS (
SELECT
a.owner,
a.application_id
FROM apex_applications a
JOIN lov_app_schemas s
ON s.owner = a.owner
)
SELECT
p.application_id,
p.page_id,
MIN(p.authorization_scheme) AS auth_scheme,
--
MIN(CASE WHEN a.position = 0 THEN a.package_name END) AS package_name,
MIN(CASE WHEN a.position = 0 THEN a.object_name END) AS procedure_name,
MIN(CASE WHEN a.position = 0 THEN a.pls_type END) AS data_type,
MIN(CASE WHEN a.position = 1 THEN a.argument_name END) AS argument_name
FROM apex_application_pages p
JOIN w
ON w.application_id = p.application_id
LEFT JOIN all_procedures s
ON s.owner = w.owner
AND s.object_name IN ('A' || TO_CHAR(p.application_id), 'APP', 'AUTH') -- packages
AND s.procedure_name = p.authorization_scheme
LEFT JOIN all_arguments a
ON a.owner = s.owner
AND a.object_name = s.procedure_name
AND a.package_name = s.object_name
AND a.overload IS NULL
AND ((
a.position = 0
AND a.argument_name IS NULL
AND a.in_out = 'OUT'
)
OR (
a.position = 1
AND a.data_type = 'NUMBER'
AND a.in_out = 'IN'
)
)
GROUP BY p.application_id, p.page_id;
--

View File

@ -1,138 +0,0 @@
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP MATERIALIZED VIEW NAV_OVERVIEW_MVW');
DBMS_OUTPUT.PUT_LINE('--');
DBMS_OUTPUT.PUT_LINE('-- MATERIALIZED VIEW NAV_OVERVIEW_MVW DROPPED');
DBMS_OUTPUT.PUT_LINE('--');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
--
CREATE MATERIALIZED VIEW nav_overview_mvw
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
AS
WITH t AS (
SELECT /*+ MATERIALIZE */
ROWNUM AS r#, -- to keep hierarchy sorted
t.*
FROM (
SELECT
n.app_id,
n.page_id,
n.order#,
--
REPLACE(p.page_name, '&' || 'APP_NAME.', a.application_name) AS page_name,
REPLACE(p.page_title, '&' || 'APP_NAME.', a.application_name) AS page_title,
--
p.page_alias,
p.page_group,
p.authorization_scheme,
p.page_css_classes,
p.page_mode,
p.page_template,
p.page_comment AS comments,
--
'#' AS javascript_target,
i.item_source AS javascript,
--
LEVEL - 1 AS depth,
CONNECT_BY_ROOT NVL(n.order#, n.page_id) AS page_root
FROM navigation n
JOIN apps a
ON a.app_id = n.app_id
LEFT JOIN apex_application_pages p
ON p.application_id = n.app_id
AND p.page_id = n.page_id
LEFT JOIN apex_applications a
ON a.application_id = p.application_id
LEFT JOIN apex_application_page_items i
ON i.application_id = n.app_id
AND i.item_name = 'P' || TO_CHAR(n.page_id) || '_JAVASCRIPT_TARGET'
CONNECT BY n.parent_id = PRIOR n.page_id
AND n.app_id = PRIOR n.app_id
START WITH n.parent_id IS NULL
ORDER SIBLINGS BY n.app_id, n.order#, n.page_id
) t
)
SELECT
n.app_id,
n.page_id,
n.parent_id,
n.order#,
t.r#,
--
t.page_root,
t.page_root || ' ' || COALESCE (
t.page_group,
(
SELECT t.page_group
FROM t
WHERE t.app_id = n.app_id
AND t.page_id = n.parent_id
)
) AS page_group,
--
t.page_alias,
t.depth,
t.page_name,
t.page_title,
t.page_css_classes AS css_class,
t.page_template,
--
n.is_hidden,
n.is_reset,
n.is_shared,
--
CASE WHEN t.page_mode = 'Normal' THEN NULL ELSE 'Y' END AS is_modal,
CASE WHEN t.javascript IS NOT NULL THEN 'Y' END AS is_javascript,
t.javascript,
t.javascript_target,
--
CASE
WHEN t.authorization_scheme LIKE '%MUST_NOT_BE_PUBLIC_USER%'
THEN app.get_icon('fa-check-square', 'MUST_NOT_BE_PUBLIC_USER')
--
WHEN t.authorization_scheme IS NULL AND n.page_id NOT IN (0, 9999)
THEN app.get_icon('fa-warning', 'Auth scheme is missing')
--
ELSE nav.get_html_a(app.get_page_url (
in_page_id => 920,
in_app_id => n.app_id,
in_names => 'P920_AUTH_SCHEME',
in_values => t.authorization_scheme
), t.authorization_scheme)
END AS auth_scheme,
--
CASE
WHEN t.javascript_target IS NOT NULL
THEN t.javascript_target
--
WHEN n.page_id > 0
THEN app.get_page_url (
in_page_id => n.page_id,
in_app_id => n.app_id,
in_session_id => CASE WHEN n.page_id = 9999 THEN 0 END
)
END AS page_url,
--
t.comments,
--
'UD' AS allow_changes, -- U = update, D = delete
--
t.page_root || '.' || TO_CHAR(10000 + t.r#) || '.' || NVL(t.order#, t.page_id) || '.' || n.page_id AS sort_order
FROM navigation n
JOIN apps a
ON a.app_id = n.app_id
LEFT JOIN t
ON t.app_id = n.app_id
AND t.page_id = n.page_id
WHERE (n.app_id, n.page_id) NOT IN (
SELECT
app.get_core_app_id() AS app_id,
947 AS page_id
FROM DUAL
);
--

View File

@ -0,0 +1,86 @@
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP MATERIALIZED VIEW NAV_SOURCE_PAGES_MV');
DBMS_OUTPUT.PUT_LINE('--');
DBMS_OUTPUT.PUT_LINE('-- MATERIALIZED VIEW NAV_SOURCE_PAGES_MV DROPPED');
DBMS_OUTPUT.PUT_LINE('--');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
--
CREATE MATERIALIZED VIEW nav_source_pages_mv
SEGMENT CREATION IMMEDIATE
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
AS
SELECT
/**
* THIS VIEW SHOULD BE PLACED IN EACH DATABASE SCHEMA
* TO PROVIDE ACCESS TO APEX VIEWS FOR DIFFERENT SCHEMAS
* AND TO INCREASE NAVIGATION PERFORMANCE
*/
a.workspace,
a.owner,
p.application_id AS app_id,
p.page_id,
p.page_alias,
p.page_name,
p.page_title,
p.page_group,
p.page_mode,
p.page_template,
p.page_comment AS comments,
p.authorization_scheme AS auth_scheme,
--
NULLIF(MIN(s.owner || '.' || s.object_name || '.' || s.procedure_name), '..') AS procedure_name,
--
MIN(CASE WHEN g.position = 0 THEN g.pls_type END) AS data_type,
MIN(CASE WHEN g.position = 1 THEN g.argument_name END) AS page_argument,
MIN(i.item_source) AS javascript
--
FROM apex_application_pages p
JOIN apex_applications a
ON a.application_id = p.application_id
LEFT JOIN all_procedures s
ON s.owner IN (USER, USER || '_OWNER')
AND s.object_name = 'AUTH'
AND s.procedure_name = p.authorization_scheme
LEFT JOIN all_arguments g
ON g.owner = s.owner
AND g.object_name = s.procedure_name
AND g.package_name = s.object_name
AND g.overload IS NULL
AND ((
g.position = 0
AND g.argument_name IS NULL
AND g.in_out = 'OUT'
)
OR (
g.position = 1
AND g.data_type = 'NUMBER'
AND g.in_out = 'IN'
)
)
LEFT JOIN apex_application_page_items i
ON i.application_id = p.application_id
AND i.page_id = p.page_id
AND i.item_name = 'P' || TO_CHAR(i.page_id) || '_JAVASCRIPT_TARGET'
WHERE a.workspace != 'INTERNAL'
GROUP BY
a.workspace,
a.owner,
p.application_id,
p.page_id,
p.page_alias,
p.page_name,
p.page_title,
p.page_group,
p.page_mode,
p.page_template,
p.page_comment,
p.authorization_scheme
ORDER BY p.application_id, p.page_id;
--
CREATE UNIQUE INDEX uq_nav_source_pages_mv ON nav_source_pages_mv (app_id, page_id);

View File

@ -0,0 +1,35 @@
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP MATERIALIZED VIEW NAV_SOURCE_SORTED_MV');
DBMS_OUTPUT.PUT_LINE('--');
DBMS_OUTPUT.PUT_LINE('-- MATERIALIZED VIEW NAV_SOURCE_SORTED_MV DROPPED');
DBMS_OUTPUT.PUT_LINE('--');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
--
CREATE MATERIALIZED VIEW nav_source_sorted_mv
SEGMENT CREATION IMMEDIATE
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
AS
SELECT
ROWNUM AS r#, -- to keep hierarchy sorted
t.*
FROM (
SELECT
n.*,
LEVEL - 1 AS depth,
CONNECT_BY_ROOT NVL(n.order#, n.page_id) AS page_root
FROM navigation n
JOIN apps a
ON a.app_id = n.app_id
CONNECT BY n.parent_id = PRIOR n.page_id
AND n.app_id = PRIOR n.app_id
START WITH n.parent_id IS NULL
ORDER SIBLINGS BY n.app_id, n.order#, n.page_id
) t;
--
CREATE UNIQUE INDEX uq_nav_source_sorted_mv ON nav_source_sorted_mv (app_id, page_id);

View File

@ -1,5 +1,5 @@
-- DROP MATERIALIZED VIEW obj_modules_mvw;
CREATE MATERIALIZED VIEW obj_modules_mvw
-- DROP MATERIALIZED VIEW source_modules_mv;
CREATE MATERIALIZED VIEW source_modules_mv
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
AS

View File

@ -462,8 +462,7 @@ CREATE OR REPLACE PACKAGE app AS
in_names VARCHAR2 := NULL,
in_values VARCHAR2 := NULL,
in_overload VARCHAR2 := NULL, -- JSON object to overload passed items/values
in_transform BOOLEAN := FALSE, -- to pass all page items to new page
in_reset BOOLEAN := TRUE, -- reset page items
in_reset CHAR := 'Y', -- reset page items
in_session_id sessions.session_id%TYPE := NULL,
in_app_id navigation.app_id%TYPE := NULL
)
@ -1487,7 +1486,7 @@ CREATE OR REPLACE PACKAGE app AS
--
-- Rebuild source lines for views
--
PROCEDURE rebuild_user_source_views (
PROCEDURE rebuild_source_lines (
in_owner apex_applications.owner%TYPE := NULL
);

View File

@ -1113,8 +1113,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
in_names VARCHAR2 := NULL,
in_values VARCHAR2 := NULL,
in_overload VARCHAR2 := NULL, -- JSON object to overload passed items/values
in_transform BOOLEAN := FALSE, -- to pass all page items to new page
in_reset BOOLEAN := TRUE, -- reset page items
in_reset CHAR := 'Y', -- reset page items
in_session_id sessions.session_id%TYPE := NULL,
in_app_id navigation.app_id%TYPE := NULL
)
@ -1160,7 +1159,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
p_application => in_app_id,
p_session => COALESCE(in_session_id, app.get_session_id()),
p_page => out_page_id,
p_clear_cache => CASE WHEN in_reset THEN out_page_id END,
p_clear_cache => CASE WHEN in_reset = 'Y' THEN out_page_id END,
p_items => out_names,
p_values => NULLIF(out_values, 'NULL')
/*
@ -3996,14 +3995,18 @@ CREATE OR REPLACE PACKAGE BODY app AS
PROCEDURE rebuild_user_source_views (
PROCEDURE rebuild_source_lines (
in_owner apex_applications.owner%TYPE := NULL
)
AS
BEGIN
app.log_module(in_owner);
--
DELETE FROM user_source_views t
-- @TODO: procedures
-- @TODO: jobs
-- refresh view content
DELETE FROM source_lines t
WHERE t.owner = NVL(in_owner, t.owner);
--
FOR c IN (
@ -4012,11 +4015,9 @@ CREATE OR REPLACE PACKAGE BODY app AS
t.view_name AS name,
app.get_long_string('ALL_VIEWS', 'TEXT', 'VIEW_NAME', t.view_name, in_owner => t.owner) || ';' AS text
FROM all_views t
JOIN lov_app_schemas s
ON s.owner = t.owner
WHERE t.owner = NVL(in_owner, t.owner)
WHERE t.owner = NVL(in_owner, t.owner)
) LOOP
INSERT INTO user_source_views (owner, name, line, text)
INSERT INTO source_lines (owner, name, line, text)
SELECT
c.owner,
c.name,

View File

@ -22,7 +22,7 @@ CREATE OR REPLACE PACKAGE constants AS
flag_trigger CONSTANT logs.flag%TYPE := 'G'; -- called from trigger
-- specify maximum length for trim
length_user CONSTANT PLS_INTEGER := 30; -- logs.user_id%TYPE
length_user CONSTANT PLS_INTEGER := 128; -- logs.user_id%TYPE
length_action CONSTANT PLS_INTEGER := 64; -- logs.action_name%TYPE, v_$session.action
length_module CONSTANT PLS_INTEGER := 64; -- logs.module_name%TYPE
length_arguments CONSTANT PLS_INTEGER := 2000; -- logs.arguments%TYPE

View File

@ -33,10 +33,16 @@ CREATE OR REPLACE PACKAGE nav AS
-- Check if user have permissions to access the page
--
FUNCTION is_page_available (
in_page_id navigation.page_id%TYPE,
in_app_id navigation.app_id%TYPE
in_auth_scheme VARCHAR2,
in_app_id NUMBER,
in_page_id NUMBER,
in_procedure_name VARCHAR2,
in_data_type VARCHAR2,
in_page_argument VARCHAR2
)
RETURN CHAR;
RETURN CHAR
--AUTHID CURRENT_USER
RESULT_CACHE;
@ -102,14 +108,7 @@ CREATE OR REPLACE PACKAGE nav AS
--
-- Refresh navigation MVW in a background job and inform user
--
PROCEDURE refresh_nav_views (
in_log_id logs.log_id%TYPE,
in_user_id logs.user_id%TYPE,
in_app_id logs.app_id%TYPE,
in_lang_id users.lang_id%TYPE
);
-- Refresh navigation views
--
PROCEDURE refresh_nav_views;

View File

@ -1,99 +1,56 @@
CREATE OR REPLACE PACKAGE BODY nav AS
FUNCTION is_page_available (
in_page_id navigation.page_id%TYPE,
in_app_id navigation.app_id%TYPE
in_auth_scheme VARCHAR2,
in_app_id NUMBER,
in_page_id NUMBER,
in_procedure_name VARCHAR2,
in_data_type VARCHAR2,
in_page_argument VARCHAR2
)
RETURN CHAR
--AUTHID CURRENT_USER
RESULT_CACHE
AS
v_auth_scheme apex_application_pages.authorization_scheme%TYPE;
v_package_name user_procedures.object_name%TYPE;
v_procedure_name user_procedures.procedure_name%TYPE;
v_data_type user_arguments.pls_type%TYPE;
v_page_argument user_arguments.argument_name%TYPE;
out_result_bool BOOLEAN;
out_result CHAR(1);
--
out_result CHAR;
out_result_bool BOOLEAN;
--
PRAGMA UDF; -- SQL only
PRAGMA UDF;
BEGIN
-- get auth cheme, procedure...
SELECT
n.auth_scheme,
n.package_name,
n.procedure_name,
n.data_type,
n.argument_name
INTO v_auth_scheme, v_package_name, v_procedure_name, v_data_type, v_page_argument
FROM nav_availability_mvw n
WHERE n.application_id = in_app_id
AND n.page_id = in_page_id;
-- log current page
IF app.is_debug_on() AND in_page_id = app.get_page_id() THEN
app.log_action (
'IS_PAGE_AVAILABLE',
in_app_id,
in_page_id,
NVL(v_auth_scheme, '-'),
NVL(v_package_name || '.' || v_procedure_name, '-'),
NVL(v_data_type, '-'),
NVL(v_page_argument, '-')
);
END IF;
-- skip global page and login/logout page
IF in_page_id IN (0, 9999) THEN
RETURN 'Y'; -- show
END IF;
-- check scheme and procedure
IF v_auth_scheme IS NULL THEN
app.log_warning('AUTH_SCHEME_MISSING', in_app_id, in_page_id);
--
RETURN 'Y'; -- show, page has no authorization set
--
ELSIF v_auth_scheme IN ('MUST_NOT_BE_PUBLIC_USER') THEN
RETURN 'Y'; -- show
--
ELSIF v_procedure_name IS NULL THEN
app.log_warning('AUTH_PROCEDURE_MISSING', in_app_id, in_page_id, v_auth_scheme);
--
IF app.is_developer() THEN -- show in menu, allow access
RETURN 'Y';
END IF;
--
RETURN 'N'; -- hide, auth function is set on page but missing in AUTH package
IF in_auth_scheme = 'NOBODY - HIDDEN' THEN
RETURN 'N';
ELSIF (in_auth_scheme IS NULL OR in_procedure_name IS NULL) THEN
RETURN 'Y';
END IF;
-- call function to evaluate access
IF v_data_type = 'BOOLEAN' THEN
IF v_page_argument IS NOT NULL THEN
IF in_data_type = 'BOOLEAN' THEN
IF in_page_argument IS NOT NULL THEN
-- pass page_id when neeeded
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '(:page_id); END;'
USING IN in_page_id, OUT out_result_bool;
'BEGIN :r := ' || in_procedure_name || '(:page_id); END;'
USING OUT out_result_bool, IN in_page_id;
ELSE
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '; END;'
'BEGIN :r := ' || in_procedure_name || '; END;'
USING OUT out_result_bool;
END IF;
--
RETURN CASE WHEN out_result_bool THEN 'Y' ELSE 'N' END;
ELSE
IF v_page_argument IS NOT NULL THEN
IF in_page_argument IS NOT NULL THEN
-- pass page_id when neeeded
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '(:page_id); END;'
USING IN in_page_id, OUT out_result;
'BEGIN :r := ' || in_procedure_name || '(:page_id); END;'
USING OUT out_result, IN in_page_id;
ELSE
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '; END;'
'BEGIN :r := ' || in_procedure_name || '; END;'
USING OUT out_result;
END IF;
--
RETURN NVL(out_result, 'N');
END IF;
--
RETURN NVL(out_result, 'N');
END;
@ -118,8 +75,7 @@ CREATE OR REPLACE PACKAGE BODY nav AS
in_names => in_names,
in_values => in_values,
in_overload => in_overload,
in_transform => in_transform,
in_reset => in_reset
in_reset => CASE WHEN in_reset THEN 'Y' END
);
--
app.log_debug('REDIRECT', app.get_json_list(in_page_id, in_names, in_values, out_target));
@ -270,57 +226,21 @@ CREATE OR REPLACE PACKAGE BODY nav AS
PROCEDURE refresh_nav_views (
in_log_id logs.log_id%TYPE,
in_user_id logs.user_id%TYPE,
in_app_id logs.app_id%TYPE,
in_lang_id users.lang_id%TYPE
)
AS
BEGIN
DBMS_MVIEW.REFRESH('NAV_AVAILABILITY_MVW', 'C', parallelism => 2);
DBMS_MVIEW.REFRESH('NAV_OVERVIEW_MVW', 'C', parallelism => 2);
--
/*
app_actions.send_message (
in_app_id => in_app_id,
in_user_id => in_user_id,
in_message => app.get_translated_message('MVW_REFRESHED', in_app_id, in_lang_id)
);*/
--
app.log_success(TO_CHAR(in_log_id));
EXCEPTION
WHEN OTHERS THEN
/*
app_actions.send_message (
in_app_id => in_app_id,
in_user_id => in_user_id,
in_message => app.get_translated_message('MVW_FAILED', in_app_id, in_lang_id),
in_type => 'WARNING'
);*/
COMMIT;
--
app.raise_error();
END;
PROCEDURE refresh_nav_views
AS
v_log_id logs.log_id%TYPE;
v_query VARCHAR2(32767);
BEGIN
v_log_id := app.log_module();
app.log_module();
--
app.create_job (
in_job_name => 'RECALC_MVW_NAV',
in_statement => 'nav.refresh_nav_views('
|| v_log_id || ', '''
|| app.get_user_id() || ''', '
|| app.get_app_id() || ', '''
|| app.get_user_lang() || ''''
|| ');'
);
FOR c IN (
SELECT v.mview_name
FROM user_mviews v
WHERE v.mview_name LIKE 'NAV\_%' ESCAPE '\'
) LOOP
DBMS_MVIEW.REFRESH(c.mview_name, 'C', parallelism => 2);
app.log_result(c.mview_name);
END LOOP;
--
app.log_success();
EXCEPTION
WHEN app.app_exception THEN
RAISE;

View File

@ -63,14 +63,16 @@ BEGIN
FROM user_objects o
WHERE o.status != 'VALID'
AND o.object_type NOT IN ('SEQUENCE')
AND (o.object_type LIKE in_type ESCAPE '\' OR in_type IS NULL)
AND (o.object_name LIKE in_name ESCAPE '\' OR in_name IS NULL)
AND o.object_name != $$PLSQL_UNIT -- not this procedure
UNION ALL
SELECT o.object_name, o.object_type
FROM user_objects o
WHERE in_force_y = 'Y'
AND o.object_type IN ('PACKAGE', 'PACKAGE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER', 'VIEW', 'SYNONYM')
AND (o.object_type LIKE in_type OR in_type IS NULL)
AND (o.object_name LIKE in_name OR in_name IS NULL)
AND (o.object_type LIKE in_type ESCAPE '\' OR in_type IS NULL)
AND (o.object_name LIKE in_name ESCAPE '\' OR in_name IS NULL)
AND o.object_name != $$PLSQL_UNIT -- not this procedure
) o
ORDER BY CASE o.object_type
@ -143,8 +145,10 @@ BEGIN
-- show number of invalid objects
SELECT COUNT(*) INTO v_invalids
FROM user_objects o
WHERE o.status != 'VALID'
AND o.object_name != $$PLSQL_UNIT; -- not this procedure
WHERE o.status != 'VALID'
AND (o.object_type LIKE in_type ESCAPE '\' OR in_type IS NULL)
AND (o.object_name LIKE in_name ESCAPE '\' OR in_name IS NULL)
AND o.object_name != $$PLSQL_UNIT; -- not this procedure
--
DBMS_OUTPUT.PUT_LINE(' -> ' || v_invalids);
DBMS_OUTPUT.PUT_LINE('');
@ -155,7 +159,10 @@ BEGIN
FOR c IN (
SELECT DISTINCT o.object_type, o.object_name
FROM user_objects o
WHERE o.status != 'VALID'
WHERE o.status != 'VALID'
AND (o.object_type LIKE in_type ESCAPE '\' OR in_type IS NULL)
AND (o.object_name LIKE in_name ESCAPE '\' OR in_name IS NULL)
AND o.object_name != $$PLSQL_UNIT; -- not this procedure
ORDER BY o.object_type, o.object_name
) LOOP
DBMS_OUTPUT.PUT_LINE(' ' || LPAD(CASE WHEN c.object_type != v_last_type THEN c.object_type END || ' | ', 20, ' ') || c.object_name);

View File

@ -1,8 +1,8 @@
CREATE TABLE apps (
app_id NUMBER(4,0) CONSTRAINT nn_apps_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_apps_app_id NOT NULL,
description_ VARCHAR2(1000),
is_visible CHAR(1),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_apps_is_visible

View File

@ -1,11 +1,12 @@
--DROP TABLE events;
CREATE TABLE events (
app_id NUMBER(4,0) CONSTRAINT nn_events_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_events_app_id NOT NULL,
event_id VARCHAR2(30) CONSTRAINT nn_events_event_id NOT NULL,
event_name VARCHAR2(64),
event_group VARCHAR2(64),
description_ VARCHAR2(1000),
is_active CHAR(1),
updated_by VARCHAR2(30) DEFAULT NULL,
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_events_is_active

View File

@ -1,9 +1,10 @@
--DROP TABLE log_events;
CREATE TABLE log_events (
log_id INTEGER CONSTRAINT nn_log_events_log_id NOT NULL,
log_parent INTEGER,
app_id NUMBER(4,0) CONSTRAINT nn_log_events_app_id NOT NULL,
page_id NUMBER(6,0) CONSTRAINT nn_log_events_page_id NOT NULL,
user_id VARCHAR2(30) CONSTRAINT nn_log_events_user_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_log_events_app_id NOT NULL,
page_id NUMBER(8,0) CONSTRAINT nn_log_events_page_id NOT NULL,
user_id VARCHAR2(128) CONSTRAINT nn_log_events_user_id NOT NULL,
session_id INTEGER CONSTRAINT nn_log_events_session_id NOT NULL,
event_id VARCHAR2(30) CONSTRAINT nn_log_events_event_id NOT NULL,
event_value NUMBER,

View File

@ -1,16 +1,18 @@
--DROP TABLE logs;
CREATE TABLE logs (
log_id INTEGER CONSTRAINT nn_logs_log_id NOT NULL,
log_parent INTEGER,
app_id NUMBER(4,0) CONSTRAINT nn_logs_app_id NOT NULL,
page_id NUMBER(6,0),
user_id VARCHAR2(30),
app_id NUMBER(8,0) CONSTRAINT nn_logs_app_id NOT NULL,
page_id NUMBER(8,0),
user_id VARCHAR2(128),
flag CHAR(1) CONSTRAINT nn_logs_flag NOT NULL,
action_name VARCHAR2(32),
module_name VARCHAR2(48),
action_name VARCHAR2(64),
module_name VARCHAR2(64),
module_line NUMBER(8,0),
module_timer VARCHAR2(12),
arguments VARCHAR2(2000),
arguments VARCHAR2(4000),
payload VARCHAR2(4000),
debug_id INTEGER,
session_id INTEGER,
created_at TIMESTAMP(6) CONSTRAINT nn_logs_created_at NOT NULL,
--

View File

@ -1,11 +1,12 @@
--DROP TABLE logs_blacklist;
CREATE TABLE logs_blacklist (
app_id NUMBER(4,0),
app_id NUMBER(8,0),
flag CHAR(1),
user_id VARCHAR2(30),
page_id NUMBER(6,0),
module_like VARCHAR2(30),
action_like VARCHAR2(30),
updated_by VARCHAR2(30),
page_id NUMBER(8,0),
module_like VARCHAR2(64),
action_like VARCHAR2(64),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT uq_logs_blacklist

View File

@ -1,11 +1,11 @@
CREATE TABLE mail_queue (
queue_id NUMBER(10,0) CONSTRAINT nn_mail_queue_queue_id NOT NULL,
app_id NUMBER(4,0) CONSTRAINT nn_mail_queue_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_mail_queue_app_id NOT NULL,
event_id VARCHAR2(30),
role_id VARCHAR2(30),
template_id VARCHAR2(30),
schedule_id VARCHAR2(30),
user_id VARCHAR2(30),
user_id VARCHAR2(128),
lang_id VARCHAR2(5),
mail_recipient VARCHAR2(4000),
mail_cc VARCHAR2(4000),
@ -13,7 +13,7 @@ CREATE TABLE mail_queue (
mail_sender VARCHAR2(256),
mail_subject VARCHAR2(256),
mail_body CLOB,
created_by VARCHAR2(30),
created_by VARCHAR2(128),
created_at DATE,
sent_at DATE,
--

View File

@ -1,5 +1,5 @@
CREATE TABLE mail_schedules (
app_id NUMBER(4,0) CONSTRAINT nn_mail_schedules_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_mail_schedules_app_id NOT NULL,
schedule_id VARCHAR2(30) CONSTRAINT nn_mail_schedules_schedule_id NOT NULL,
schedule_group VARCHAR2(64),
description_ VARCHAR2(256),
@ -9,7 +9,7 @@ CREATE TABLE mail_schedules (
schedule_hour VARCHAR2(128),
schedule_minute VARCHAR2(128),
schedule_interval VARCHAR2(128),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_mail_schedules_hour

View File

@ -1,5 +1,5 @@
CREATE TABLE mail_subscriptions (
app_id NUMBER(4,0) CONSTRAINT nn_mail_subscriptions_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_mail_subscriptions_app_id NOT NULL,
event_id VARCHAR2(30) CONSTRAINT nn_mail_subscriptions_event_id NOT NULL,
role_id VARCHAR2(30) CONSTRAINT nn_mail_subscriptions_role_id NOT NULL,
schedule_id VARCHAR2(30) CONSTRAINT nn_mail_subscriptions_schedule_id NOT NULL,
@ -8,7 +8,7 @@ CREATE TABLE mail_subscriptions (
is_active CHAR(1),
processed_log_id NUMBER,
processed_at DATE,
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_mail_subscriptions_is_active

View File

@ -1,5 +1,6 @@
--DROP TABLE mail_templates;
CREATE TABLE mail_templates (
app_id NUMBER(4,0) CONSTRAINT nn_mail_templates_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_mail_templates_app_id NOT NULL,
template_id VARCHAR2(30) CONSTRAINT nn_mail_templates_template_id NOT NULL,
lang_id VARCHAR2(5) CONSTRAINT nn_mail_templates_lang_id NOT NULL,
template_group VARCHAR2(64),
@ -7,7 +8,7 @@ CREATE TABLE mail_templates (
process_function VARCHAR2(64),
mail_subject VARCHAR2(256),
mail_body CLOB,
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT pk_mail_templates

View File

@ -1,12 +1,13 @@
--DROP TABLE navigation;
CREATE TABLE navigation (
app_id NUMBER(4,0) CONSTRAINT nn_navigation_app_id NOT NULL,
page_id NUMBER(6,0) CONSTRAINT nn_navigation_page_id NOT NULL,
parent_id NUMBER(6,0),
app_id NUMBER(8,0) CONSTRAINT nn_navigation_app_id NOT NULL,
page_id NUMBER(8,0) CONSTRAINT nn_navigation_page_id NOT NULL,
parent_id NUMBER(8,0),
order# NUMBER(4,0),
is_hidden CHAR(1),
is_reset CHAR(1),
is_shared CHAR(1),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_navigation_is_hidden

View File

@ -1,12 +1,12 @@
CREATE TABLE roles (
app_id NUMBER(4,0) CONSTRAINT nn_roles_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_roles_app_id NOT NULL,
role_id VARCHAR2(30) CONSTRAINT nn_roles_role_id NOT NULL,
role_name VARCHAR2(64),
role_group VARCHAR2(64),
description_ VARCHAR2(1000),
is_active CHAR(1),
order# NUMBER(4,0),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_roles_is_active

View File

@ -1,19 +0,0 @@
CREATE TABLE roles_e$ (
ora_err_number$ NUMBER,
ora_err_mesg$ VARCHAR2(2000),
ora_err_rowid$ UROWID(4000),
ora_err_optyp$ VARCHAR2(2),
ora_err_tag$ VARCHAR2(2000),
app_id VARCHAR2(4000),
role_id VARCHAR2(32767),
role_name VARCHAR2(32767),
role_group VARCHAR2(32767),
description_ VARCHAR2(32767),
is_active VARCHAR2(32767),
order# VARCHAR2(4000),
updated_by VARCHAR2(32767),
updated_at VARCHAR2(4000)
);
--
COMMENT ON TABLE roles_e$ IS 'DML Error Logging table for "CORE"."ROLES"';

View File

@ -1,7 +1,9 @@
--DROP TABLE sessions;
CREATE TABLE sessions (
app_id NUMBER(4,0) CONSTRAINT nn_sessions_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_sessions_app_id NOT NULL,
session_id INTEGER CONSTRAINT nn_sessions_session_id NOT NULL,
user_id VARCHAR2(30) CONSTRAINT nn_sessions_user_id NOT NULL,
user_id VARCHAR2(128) CONSTRAINT nn_sessions_user_id NOT NULL,
persistent_items VARCHAR2(4000),
created_at DATE CONSTRAINT nn_sessions_created_at NOT NULL,
updated_at DATE CONSTRAINT nn_sessions_updated_at NOT NULL,
--
@ -20,9 +22,10 @@ CREATE TABLE sessions (
--
COMMENT ON TABLE sessions IS '[CORE] List of sessions';
--
COMMENT ON COLUMN sessions.app_id IS 'APEX application ID';
COMMENT ON COLUMN sessions.session_id IS 'Session ID generated by APEX, used also in LOGS';
COMMENT ON COLUMN sessions.user_id IS 'User ID';
COMMENT ON COLUMN sessions.created_at IS 'Time of creation';
COMMENT ON COLUMN sessions.updated_at IS 'Time of last update';
COMMENT ON COLUMN sessions.app_id IS 'APEX application ID';
COMMENT ON COLUMN sessions.session_id IS 'Session ID generated by APEX, used also in LOGS';
COMMENT ON COLUMN sessions.user_id IS 'User ID';
COMMENT ON COLUMN sessions.persistent_items IS 'Items to retrieve after login';
COMMENT ON COLUMN sessions.created_at IS 'Time of creation';
COMMENT ON COLUMN sessions.updated_at IS 'Time of last update';

View File

@ -0,0 +1,20 @@
--DROP TABLE setting_colors;
CREATE TABLE setting_colors (
app_id NUMBER(8,0) CONSTRAINT nn_setting_colors_app_id NOT NULL,
status_id VARCHAR2(30) CONSTRAINT nn_setting_colors_status_id NOT NULL,
treshold_min NUMBER,
treshold_max NUMBER,
color_code VARCHAR2(8),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT pk_setting_colors
PRIMARY KEY (app_id, status_id),
--
CONSTRAINT fk_setting_colors_app_id
FOREIGN KEY (app_id)
REFERENCES apps (app_id)
);
--
COMMENT ON TABLE setting_colors IS '[CORE] List of colors for settings overrides';

View File

@ -1,10 +1,11 @@
--DROP TABLE setting_contexts;
CREATE TABLE setting_contexts (
app_id NUMBER(4,0) CONSTRAINT nn_setting_contexts_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_setting_contexts_app_id NOT NULL,
context_id VARCHAR2(64) CONSTRAINT nn_setting_contexts_name NOT NULL,
context_name VARCHAR2(64),
description_ VARCHAR2(1000),
order# NUMBER(4,0),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT uq_setting_contexts

View File

@ -1,5 +1,6 @@
--DROP TABLE settings;
CREATE TABLE settings (
app_id NUMBER(4,0) CONSTRAINT nn_settings_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_settings_app_id NOT NULL,
setting_name VARCHAR2(30) CONSTRAINT nn_settings_id NOT NULL,
setting_value VARCHAR2(256),
setting_context VARCHAR2(64),
@ -8,7 +9,7 @@ CREATE TABLE settings (
is_date CHAR(1),
is_private CHAR(1),
description_ VARCHAR2(1000),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_settings_is_active

View File

@ -0,0 +1,17 @@
CREATE TABLE source_lines (
owner VARCHAR2(30) CONSTRAINT nn_source_lines_owner NOT NULL,
name VARCHAR2(30) CONSTRAINT nn_source_lines_name NOT NULL,
line NUMBER(10,0) CONSTRAINT nn_source_lines_line NOT NULL,
text VARCHAR2(2000),
--
CONSTRAINT pk_source_lines
PRIMARY KEY (owner, name, line)
);
--
COMMENT ON TABLE source_lines IS '[CORE] User views source converted to lines';
--
COMMENT ON COLUMN source_lines.owner IS 'View owner';
COMMENT ON COLUMN source_lines.name IS 'View name';
COMMENT ON COLUMN source_lines.line IS 'Line number';
COMMENT ON COLUMN source_lines.text IS 'Line content';

View File

@ -1,13 +1,14 @@
--DROP TABLE translated_items;
CREATE TABLE translated_items (
app_id NUMBER(4,0) CONSTRAINT nn_translated_items_app_id NOT NULL,
page_id NUMBER(6,0) CONSTRAINT nn_translated_items_page_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_translated_items_app_id NOT NULL,
page_id NUMBER(8,0) CONSTRAINT nn_translated_items_page_id NOT NULL,
item_name VARCHAR2(64) CONSTRAINT nn_translated_items_name NOT NULL,
value_en VARCHAR2(2000),
value_cz VARCHAR2(2000),
value_sk VARCHAR2(2000),
value_pl VARCHAR2(2000),
value_hu VARCHAR2(2000),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT pk_translated_items

View File

@ -1,12 +1,13 @@
--DROP TABLE translated_messages;
CREATE TABLE translated_messages (
app_id NUMBER(4,0) CONSTRAINT nn_translated_messages_app_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_translated_messages_app_id NOT NULL,
message VARCHAR2(256) CONSTRAINT nn_translated_messages_message NOT NULL,
value_en VARCHAR2(2000),
value_cz VARCHAR2(2000),
value_sk VARCHAR2(2000),
value_pl VARCHAR2(2000),
value_hu VARCHAR2(2000),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT pk_translated_messages

View File

@ -1,11 +1,12 @@
--DROP TABLE user_messages;
CREATE TABLE user_messages (
app_id NUMBER(4,0) CONSTRAINT nn_user_messages_app_id NOT NULL,
user_id VARCHAR2(30) CONSTRAINT nn_user_messages_user_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_user_messages_app_id NOT NULL,
user_id VARCHAR2(128) CONSTRAINT nn_user_messages_user_id NOT NULL,
message_id INTEGER CONSTRAINT nn_user_messages_message_id NOT NULL,
message_type VARCHAR2(16),
message_payload VARCHAR2(2000),
session_id INTEGER,
created_by VARCHAR2(30),
created_by VARCHAR2(128),
created_at DATE,
delivered_at DATE,
--

View File

@ -1,8 +1,8 @@
CREATE TABLE user_roles (
app_id NUMBER(4,0) CONSTRAINT nn_user_roles_app_id NOT NULL,
user_id VARCHAR2(30) CONSTRAINT nn_user_roles_user_id NOT NULL,
app_id NUMBER(8,0) CONSTRAINT nn_user_roles_app_id NOT NULL,
user_id VARCHAR2(128) CONSTRAINT nn_user_roles_user_id NOT NULL,
role_id VARCHAR2(30) CONSTRAINT nn_user_roles_role_id NOT NULL,
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT pk_user_roles

View File

@ -1,17 +0,0 @@
CREATE TABLE user_source_views (
owner VARCHAR2(30) CONSTRAINT nn_user_source_views_owner NOT NULL,
name VARCHAR2(30) CONSTRAINT nn_user_source_views_name NOT NULL,
line NUMBER(10,0) CONSTRAINT nn_user_source_views_line NOT NULL,
text VARCHAR2(2000),
--
CONSTRAINT pk_user_source_views
PRIMARY KEY (owner, name, line)
);
--
COMMENT ON TABLE user_source_views IS '[CORE] User views source converted to lines';
--
COMMENT ON COLUMN user_source_views.owner IS 'View owner';
COMMENT ON COLUMN user_source_views.name IS 'View name';
COMMENT ON COLUMN user_source_views.line IS 'Line number';
COMMENT ON COLUMN user_source_views.text IS 'Line content';

View File

@ -1,10 +1,10 @@
CREATE TABLE users (
user_id VARCHAR2(30) CONSTRAINT nn_users_user_id NOT NULL,
user_id VARCHAR2(128) CONSTRAINT nn_users_user_id NOT NULL,
user_login VARCHAR2(128) CONSTRAINT nn_users_login NOT NULL,
user_name VARCHAR2(64),
lang_id VARCHAR2(5),
is_active CHAR(1),
updated_by VARCHAR2(30),
updated_by VARCHAR2(128),
updated_at DATE,
--
CONSTRAINT ch_users_is_active

View File

@ -1,10 +0,0 @@
CREATE OR REPLACE FORCE VIEW lov_app_schemas AS
SELECT
a.owner,
a.owner AS owner_
FROM apex_applications a
WHERE a.owner NOT LIKE 'APEX%'
GROUP BY a.owner;
--
COMMENT ON TABLE lov_app_schemas IS '';

View File

@ -7,31 +7,33 @@ WITH curr AS (
app.get_page_root() AS page_root,
app.get_page_group() AS page_group,
app.get_user_id() AS user_id,
app.get_user_name() AS user_name
app.get_user_name() AS user_name,
app.get_session_id() AS session_id
FROM DUAL
)
SELECT
CASE WHEN n.parent_id IS NULL THEN 1 ELSE 2 END AS lvl,
--
CASE
WHEN n.page_id = 100 -- home page
THEN REPLACE(n.page_name, '&' || 'ENV_NAME.', app.get_env_name() || ' &' || 'nbsp; ')
WHEN n.page_id > 0
THEN REGEXP_REPLACE(REPLACE(n.page_name, '&' || 'APP_USER.', APEX_ESCAPE.HTML(NVL(curr.user_name, curr.user_id))), '^(&' || 'nbsp; )+', '')
THEN REGEXP_REPLACE(
REPLACE(
REPLACE(p.page_name, '&' || 'ENV_NAME.', app.get_env_name() || ' &' || 'nbsp; '),
'&' || 'APP_USER.', APEX_ESCAPE.HTML(NVL(curr.user_name, curr.user_id))),
'^(&' || 'nbsp; )+', '')
ELSE '</li></ul><ul class="EMPTY"></ul><ul><li style="display: none;">' -- a trick to split nav menu to left and right
END AS label,
--
CASE
WHEN n.javascript IS NOT NULL
THEN n.page_url
WHEN (p.javascript IS NOT NULL OR n.page_id = 0)
THEN '#'
WHEN n.page_id > 0
THEN APEX_PAGE.GET_URL (
p_application => n.app_id,
p_page => NVL(n.page_alias, TO_CHAR(n.page_id)),
p_page => NVL(p.page_alias, TO_CHAR(n.page_id)),
p_clear_cache => CASE WHEN n.is_reset = 'Y' THEN n.page_id END,
p_session => CASE WHEN n.page_id != 9999 THEN app.get_session_id() ELSE 0 END
p_session => CASE WHEN n.page_id != 9999 THEN curr.session_id ELSE 0 END
)
ELSE NVL(n.page_url, '#')
END AS target,
--
CASE
@ -44,8 +46,7 @@ SELECT
--
CASE
WHEN n.page_id > 0
THEN n.page_group || ' ' || n.css_class
ELSE 'HIDDEN'
THEN p.page_group
END AS attribute01,
--
NULL AS attribute02, -- prepend link with element
@ -58,12 +59,12 @@ SELECT
CASE
WHEN n.page_id = 9999
THEN 'Logout'
ELSE n.page_title
ELSE p.page_title
END AS attribute04, -- a.title
--
n.javascript AS attribute05, -- javascript action
p.javascript AS attribute05, -- javascript action
--
NULL AS attribute06, -- badge left
NULL AS attribute06, -- badge left
--
CASE WHEN b.badge IS NOT NULL
THEN '<span class="BADGE">' || b.badge || '</badge>'
@ -73,15 +74,19 @@ SELECT
NULL AS attribute09,
NULL AS attribute10,
--
n.page_group,
n.sort_order
FROM nav_overview n
n.r#
FROM nav_source_sorted_mv n
JOIN nav_source_pages_mv p
ON p.app_id = n.app_id
AND p.page_id = n.page_id
CROSS JOIN curr
LEFT JOIN nav_badges b
ON b.page_id = n.page_id
WHERE n.action IS NULL
AND n.is_hidden IS NULL
AND 'Y' = nav.is_page_available(n.page_id, n.app_id);
WHERE n.is_hidden IS NULL
AND (
'Y' = nav.is_page_available(p.auth_scheme, p.app_id, p.page_id, p.procedure_name, p.data_type, p.page_argument)
OR n.page_id IN (0, 9999)
);
--
COMMENT ON TABLE nav_top IS '[CORE - DASHBOARD] Navigation view used for rendering top menu';
--

View File

@ -1,42 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_arguments AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$PACKAGE_NAME') AS package_name,
app.get_item('$MODULE_NAME') AS module_name,
app.get_item('$MODULE_TYPE') AS module_type, -- @TODO: implement
app.get_item('$ARGUMENT_NAME') AS argument_name,
--
UPPER(app.get_item('$SEARCH_PACKAGES')) AS search_packages,
UPPER(app.get_item('$SEARCH_MODULES')) AS search_modules
FROM DUAL
)
SELECT
a.package_name,
a.object_name AS module_name,
a.overload,
NULLIF(a.position, 0) AS position,
a.argument_name,
--
CASE WHEN a.in_out IN ('IN', 'IN_OUT') THEN 'Y' END AS is_in,
CASE WHEN a.in_out IN ('OUT', 'IN_OUT') THEN 'Y' END AS is_out,
--
a.data_type,
a.data_length,
a.data_precision,
NULLIF(a.defaulted, 'N') AS is_default,
a.default_value,
--
ROW_NUMBER() OVER(ORDER BY a.package_name, a.subprogram_id, a.object_name, a.overload, a.position) AS sort#
FROM all_arguments a
JOIN x
ON a.owner = x.owner
AND a.package_name = NVL(x.package_name, a.package_name)
AND a.object_name = NVL(x.module_name, a.object_name)
AND a.argument_name = NVL(x.argument_name, a.argument_name)
--
AND (a.package_name LIKE x.search_packages || '%' ESCAPE '\' OR x.search_packages IS NULL)
AND (a.object_name LIKE x.search_modules || '%' ESCAPE '\' OR x.search_modules IS NULL);
--
COMMENT ON TABLE obj_arguments IS '';

View File

@ -1,104 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_columns AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name,
--
UPPER(app.get_item('$SEARCH_TABLES')) AS search_tables,
UPPER(app.get_item('$SEARCH_COLUMNS')) AS search_columns,
UPPER(app.get_item('$SEARCH_DATA_TYPE')) AS search_data_type,
app.get_number_item('$SEARCH_SIZE') AS search_size
FROM DUAL
),
c AS (
SELECT /*+ MATERIALIZE */
c.table_name,
c.column_id,
c.column_name,
--
c.data_type ||
CASE
WHEN c.data_type LIKE '%CHAR%' OR c.data_type = 'RAW' THEN
DECODE(NVL(c.char_length, 0), 0, '',
'(' || c.char_length || DECODE(c.char_used, 'C', ' CHAR', '') || ')'
)
WHEN c.data_type = 'NUMBER' THEN
DECODE(NVL(c.data_precision || c.data_scale, 0), 0, '',
DECODE(NVL(c.data_scale, 0), 0, '(' || c.data_precision || ')',
'(' || c.data_precision || ',' || c.data_scale || ')'
)
)
END AS data_type,
--
c.nullable,
c.data_default,
c.avg_col_len,
--
CASE WHEN c.column_name LIKE x.search_columns || '%' ESCAPE '\' THEN 'Y' END AS is_found_column,
CASE WHEN c.data_type LIKE x.search_data_type || '%' ESCAPE '\' THEN 'Y' END AS is_found_data_type,
CASE WHEN NVL(c.data_precision, c.data_length) = x.search_size THEN 'Y' END AS is_found_size
FROM all_tab_columns c
JOIN x
ON x.owner = c.owner
JOIN all_tables t
ON t.owner = c.owner
AND t.table_name = c.table_name
CROSS JOIN x
WHERE t.table_name = NVL(x.table_name, t.table_name)
AND t.table_name != app.get_dml_table(t.table_name)
AND (c.table_name LIKE '%' || x.search_tables || '%' ESCAPE '\' OR x.search_tables IS NULL)
),
n AS (
SELECT /*+ MATERIALIZE */
m.table_name,
m.column_name,
CASE WHEN SUM(CASE WHEN n.constraint_type = 'P' THEN 1 ELSE 0 END) > 0 THEN 'Y' END AS is_pk,
CASE WHEN SUM(CASE WHEN n.constraint_type = 'R' THEN 1 ELSE 0 END) > 0 THEN 'Y' END AS is_fk,
CASE WHEN SUM(CASE WHEN n.constraint_type = 'U' THEN 1 ELSE 0 END) > 0 THEN 'Y' END AS is_uq,
--
SUM(CASE WHEN n.constraint_type = 'C' THEN 1 ELSE 0 END) AS count_ch
FROM all_cons_columns m
JOIN x
ON x.owner = m.owner
JOIN all_constraints n
ON n.owner = m.owner
AND n.constraint_name = m.constraint_name
AND n.constraint_type IN ('P', 'R', 'U', 'C')
CROSS JOIN x
WHERE n.table_name = NVL(x.table_name, n.table_name)
GROUP BY m.table_name, m.column_name
)
SELECT
c.table_name,
c.column_id,
c.column_name,
c.column_name AS column_name_old,
c.data_type,
c.data_default,
c.avg_col_len AS avg_length,
--
n.is_pk,
n.is_uq,
n.is_fk,
--
CASE WHEN n.count_ch - CASE WHEN c.nullable = 'N' THEN 1 ELSE 0 END > 0 THEN 'Y' END AS is_ch,
--
CASE WHEN c.nullable = 'N' THEN 'Y' END AS is_nn,
--
m.comments
FROM c
CROSS JOIN x
LEFT JOIN n
ON n.table_name = c.table_name
AND n.column_name = c.column_name
LEFT JOIN all_col_comments m
ON m.owner = x.owner
AND m.table_name = c.table_name
AND m.column_name = c.column_name
WHERE 1 = 1
AND (c.is_found_column = 'Y' OR x.search_columns IS NULL)
AND (c.is_found_data_type = 'Y' OR x.search_data_type IS NULL)
AND (c.is_found_size = 'Y' OR x.search_size IS NULL);
--
COMMENT ON TABLE obj_columns IS '';

View File

@ -1,100 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_constraints AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
n AS (
SELECT /*+ MATERIALIZE */
XMLTYPE(DBMS_XMLGEN.GETXML('SELECT c.constraint_name AS name, c.search_condition AS text
FROM all_constraints c
WHERE c.owner = ''' || x.owner || '''
AND c.table_name = NVL(''' || x.table_name || ''', c.table_name)
AND c.constraint_type = ''C''
')) AS constraint_source
FROM x
),
s AS (
SELECT /*+ MATERIALIZE */
EXTRACTVALUE(s.object_value, '/ROW/NAME') AS constraint_name,
EXTRACTVALUE(s.object_value, '/ROW/TEXT') AS search_condition
FROM n
CROSS JOIN TABLE(XMLSEQUENCE(EXTRACT(n.constraint_source, '/ROWSET/ROW'))) s
),
p AS (
SELECT /*+ MATERIALIZE */
n.table_name,
n.constraint_name,
k.table_name AS primary_table,
LISTAGG(p.column_name, ', ') WITHIN GROUP (ORDER BY p.position) AS primary_cols,
n.r_constraint_name AS primary_constraint
FROM all_constraints n
JOIN x
ON x.owner = n.owner
AND n.table_name = NVL(x.table_name, n.table_name)
JOIN all_cons_columns c
ON c.owner = n.owner
AND c.constraint_name = n.constraint_name
JOIN all_cons_columns p
ON p.owner = n.owner
AND p.constraint_name = n.r_constraint_name
AND p.position = c.position
JOIN all_constraints k
ON k.owner = n.owner
AND k.constraint_name = n.r_constraint_name
WHERE n.constraint_type = 'R'
GROUP BY n.table_name, n.constraint_name, k.table_name, n.r_constraint_name
),
c AS (
SELECT /*+ MATERIALIZE */
n.table_name,
n.constraint_name,
n.constraint_type,
--
LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.position) AS cols,
--
MAX(CASE WHEN s.constraint_name IS NOT NULL THEN 'Y' END) AS is_nn,
MAX(CASE WHEN n.generated = 'GENERATED NAME' THEN 'Y' END) AS is_generated,
MAX(CASE WHEN n.status = 'DISABLED' THEN 'Y' END) AS is_disabled,
MAX(CASE WHEN n.deferrable = 'DEFERRABLE' THEN 'Y' END) AS is_deferred,
--
MAX(n.delete_rule) AS delete_rule
FROM all_constraints n
JOIN x
ON x.owner = n.owner
AND n.table_name = NVL(x.table_name, n.table_name)
JOIN all_cons_columns c
ON c.owner = n.owner
AND c.constraint_name = n.constraint_name
LEFT JOIN s
ON s.constraint_name = n.constraint_name
AND s.search_condition = '"' || c.column_name || '" IS NOT NULL'
WHERE n.table_name NOT IN (SELECT object_name FROM RECYCLEBIN)
GROUP BY n.table_name, n.constraint_name, n.constraint_type
)
SELECT
c.table_name,
c.constraint_name,
c.constraint_name AS constraint_name_old,
c.constraint_type,
c.cols,
--
p.primary_table,
p.primary_cols,
p.primary_constraint,
--
c.is_nn,
c.is_generated,
c.is_disabled,
c.is_deferred,
c.delete_rule,
--
TO_CHAR(CASE c.constraint_type WHEN 'P' THEN 1 WHEN 'R' THEN 2 ELSE 3 END) || c.constraint_name AS sort#
FROM c
LEFT JOIN p
ON p.table_name = c.table_name
AND p.constraint_name = c.constraint_name;
--
COMMENT ON TABLE obj_constraints IS '';

View File

@ -1,66 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_constraints_fix_dt1 AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
s AS (
SELECT
a.table_name,
a.column_name,
c.position,
--
CASE
WHEN a.data_type = 'NUMBER' THEN
a.data_type ||
CASE WHEN a.data_precision IS NOT NULL THEN '(' || a.data_precision || DECODE(a.data_scale, 0, '', ', ' || a.data_scale) || ')' END
WHEN a.data_type IN ('CHAR', 'VARCHAR', 'VARCHAR2') THEN
a.data_type || '(' ||
DECODE(a.char_used, 'C', a.char_length || ' CHAR', a.data_length) || ')'
ELSE a.data_type
END AS data_type,
--
n.constraint_type,
c.constraint_name,
n.r_constraint_name
FROM all_tab_columns a
JOIN x
ON x.owner = a.owner
JOIN all_tables t
ON t.owner = a.owner
AND t.table_name = a.table_name
JOIN all_cons_columns c
ON c.owner = a.owner
AND c.table_name = a.table_name
AND c.column_name = a.column_name
JOIN all_constraints n
ON n.owner = c.owner
AND n.constraint_name = c.constraint_name
AND n.constraint_type IN ('P', 'R')
ORDER BY a.table_name, n.constraint_type, n.constraint_name, a.column_name
)
SELECT
b.table_name AS foreign_table,
b.column_name AS foreign_column,
b.data_type AS foreign_type,
--
s.table_name AS parent_table,
s.column_name AS parent_column,
s.data_type AS parent_type,
--
'ALTER TABLE ' || LOWER(b.table_name) ||
' MODIFY ' || LOWER(b.column_name) || ' ' || s.data_type || ';' AS fix
FROM s
JOIN s b
ON b.r_constraint_name = s.constraint_name
AND b.position = s.position
CROSS JOIN x
WHERE b.data_type != s.data_type
AND (
x.table_name IN (b.table_name, s.table_name)
OR x.table_name IS NULL
);
--
COMMENT ON TABLE obj_constraints_fix_dt1 IS '';

View File

@ -1,96 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_constraints_fix_dt2 AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
s AS (
SELECT /*+ MATERIALIZE */
a.table_name,
a.column_name,
--
CASE
WHEN a.data_type = 'NUMBER' THEN
a.data_type ||
CASE WHEN a.data_precision IS NOT NULL THEN '(' || a.data_precision || DECODE(a.data_scale, 0, '', ', ' || a.data_scale) || ')' END
--
WHEN a.data_type IN ('CHAR', 'VARCHAR', 'VARCHAR2') THEN
a.data_type || '(' ||
DECODE(a.char_used, 'C', a.char_length || ' CHAR', a.data_length) || ')'
--
ELSE a.data_type
END AS data_type
FROM all_tab_columns a
JOIN x
ON x.owner = a.owner
JOIN all_tables t
ON t.owner = a.owner
AND t.table_name = a.table_name
LEFT JOIN all_mviews m
ON m.owner = a.owner
AND m.mview_name = a.table_name
LEFT JOIN obj_constraints_fix_dt1 d
ON d.foreign_table = a.table_name
AND d.foreign_column = a.column_name
WHERE t.table_name NOT LIKE '%$' ESCAPE '\' -- skip DML err tables, audit tables...
AND m.mview_name IS NULL -- skip materialized views
AND d.foreign_table IS NULL -- skip columns marked as FK errors
),
t AS (
SELECT /*+ MATERIALIZE */
s.column_name,
s.data_type,
--
COUNT(DISTINCT s.data_type) OVER (PARTITION BY s.column_name) AS count_types
FROM s
GROUP BY s.column_name, s.data_type
),
r AS (
-- unmatching column data types
SELECT /*+ MATERIALIZE */
t.*
FROM t
CROSS JOIN x
WHERE (
t.column_name IN (
SELECT c.column_name
FROM all_tab_cols c
JOIN x
ON x.owner = c.owner
AND x.table_name = c.table_name
)
OR x.table_name IS NULL
)
AND t.count_types > 1
)
SELECT
r.column_name,
s.data_type,
--
LISTAGG(nav.get_html_a(app_actions.get_object_link('TABLE', s.table_name), s.table_name), ', ')
WITHIN GROUP (ORDER BY s.table_name) AS list_tables,
--
COUNT(s.table_name) AS count_tables,
--
app.get_icon (
CASE
WHEN r.data_type = (SELECT MAX(s.data_type) FROM s WHERE s.table_name = x.table_name AND s.column_name = r.column_name)
THEN NULL
--
WHEN x.table_name IS NOT NULL
THEN 'fa-check-square'
END
) AS action_fix,
--
'ALTER TABLE ' || NVL(LOWER(x.table_name), '?') ||
' MODIFY ' || LOWER(r.column_name) || ' ' || r.data_type || ';' AS fix
FROM r
CROSS JOIN x
JOIN s
ON s.column_name = r.column_name
AND s.data_type != r.data_type
GROUP BY x.table_name, r.column_name, r.data_type, s.data_type;
--
COMMENT ON TABLE obj_constraints_fix_dt2 IS '';

View File

@ -1,48 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_indexes AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
c AS (
SELECT /*+ MATERIALIZE */
c.table_owner,
c.table_name,
c.index_name,
LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.column_position) AS list_columns
FROM all_ind_columns c
JOIN x
ON x.owner = c.table_owner
AND c.table_name = NVL(x.table_name, c.table_name)
WHERE c.table_name NOT IN (SELECT object_name FROM RECYCLEBIN)
GROUP BY c.table_owner, c.table_name, c.index_name
)
SELECT
i.table_name,
i.index_name,
i.index_type,
--
CASE WHEN i.uniqueness = 'UNIQUE' THEN 'Y' END AS is_unique,
CASE WHEN i.constraint_index = 'YES' THEN 'Y' END AS is_constraint,
CASE WHEN NVL(i.funcidx_status, i.status) = 'VALID' THEN 'Y' END AS is_valid,
CASE WHEN i.compression = 'ENABLED' THEN 'Y' END AS is_compressed,
CASE WHEN i.partitioned = 'YES' THEN 'Y' END AS is_partitioned,
CASE WHEN i.visibility = 'VISIBLE' THEN 'Y' END AS is_visible,
--
c.list_columns,
--
i.num_rows,
i.distinct_keys,
i.leaf_blocks,
i.tablespace_name,
i.last_analyzed
FROM all_indexes i
JOIN c
ON c.table_owner = i.table_owner
AND c.table_name = i.table_name
AND c.index_name = i.index_name
WHERE i.generated = 'N';
--
COMMENT ON TABLE obj_indexes IS '';

View File

@ -1,51 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_indexes_missing AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
f AS (
SELECT /*+ MATERIALIZE */
t.table_name,
t.constraint_name AS index_name,
LISTAGG(t.column_name, ', ') WITHIN GROUP (ORDER BY t.position) AS cols
FROM all_cons_columns t
JOIN all_constraints n
ON n.owner = t.owner
AND n.constraint_name = t.constraint_name
JOIN x
ON x.owner = n.owner
AND n.table_name = NVL(x.table_name, n.table_name)
WHERE n.constraint_type = 'R'
AND n.table_name NOT IN (SELECT object_name FROM RECYCLEBIN)
GROUP BY t.table_name, t.constraint_name
)
SELECT
app.get_icon('fa-plus-square') AS action,
app.get_page_url(951,
in_names => 'P951_TABLE_NAME,P951_INDEX_NAME,P951_INDEX_ADD',
in_values => f.table_name || ',' || f.index_name || ',Y'
) AS action_url,
--
f.table_name,
f.index_name,
f.cols,
--
'CREATE INDEX ' || RPAD(f.index_name, 30) ||
' ON ' || RPAD(f.table_name, 30) || ' (' || f.cols || ') COMPUTE STATISTICS;' AS fix
FROM f
LEFT JOIN (
SELECT i.table_name, i.index_name, LISTAGG(i.column_name, ', ') WITHIN GROUP (ORDER BY i.column_position) AS cols
FROM all_ind_columns i
JOIN x
ON x.owner = i.table_owner
AND i.table_name = NVL(x.table_name, i.table_name)
GROUP BY i.table_name, i.index_name
) i
ON i.table_name = f.table_name
AND i.cols LIKE f.cols || '%'
WHERE i.index_name IS NULL;
--
COMMENT ON TABLE obj_indexes_missing IS '';

View File

@ -1,122 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_modules AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$PACKAGE_NAME') AS package_name,
app.get_item('$MODULE_NAME') AS module_name,
app.get_item('$MODULE_TYPE') AS module_type,
app.get_item('$ARGUMENT_NAME') AS argument_name,
--
UPPER(app.get_item('$SEARCH_PACKAGES')) AS search_packages,
UPPER(app.get_item('$SEARCH_MODULES')) AS search_modules,
UPPER(app.get_item('$SEARCH_ARGUMENTS')) AS search_arguments,
LOWER(app.get_item('$SEARCH_SOURCE')) AS search_source
FROM DUAL
),
t AS (
SELECT /*+ MATERIALIZE */
t.*,
x.argument_name,
x.search_arguments,
x.search_source
FROM obj_modules_mvw t
JOIN x
ON x.owner = t.owner
AND t.package_name = NVL(x.package_name, t.package_name)
AND t.module_name = NVL(x.module_name, t.module_name)
--AND SUBSTR(t.module_type, 1, 1) = NVL(x.module_type, SUBSTR(t.module_type, 1, 1))
--
AND (t.package_name LIKE x.search_packages || '%' ESCAPE '\' OR x.search_packages IS NULL)
AND (t.module_name LIKE x.search_modules || '%' ESCAPE '\' OR x.search_modules IS NULL)
),
a AS (
SELECT /*+ MATERIALIZE */
t.package_name,
t.module_name,
t.subprogram_id
FROM t
JOIN all_arguments a
ON a.owner = t.owner
AND a.package_name = t.package_name
AND a.object_name = t.module_name
AND a.subprogram_id = t.subprogram_id
AND a.argument_name LIKE t.search_arguments || '%' ESCAPE '\'
AND (a.argument_name = t.argument_name OR t.argument_name IS NULL)
GROUP BY t.package_name, t.module_name, t.subprogram_id
),
s AS (
SELECT /*+ MATERIALIZE */
t.package_name,
t.module_name,
t.subprogram_id
FROM t
JOIN all_source s
ON s.owner = t.owner
AND s.name = t.package_name
AND s.line BETWEEN t.body_start AND t.body_end
AND s.text LIKE '%' || t.search_source || '%' ESCAPE '\'
)
SELECT
t.owner,
t.package_name,
t.module_name,
t.subprogram_id,
t.overload,
t.group_name,
t.is_function,
t.is_private,
t.is_autonomous,
t.is_cached,
t.is_definer,
t.args_in,
t.args_out,
t.spec_start,
t.spec_end,
t.spec_lines,
t.body_start,
t.body_end,
t.count_lines,
t.count_statements,
t.comment_
FROM t
WHERE (
(t.package_name, t.module_name, t.subprogram_id) IN (
SELECT a.package_name, a.module_name, a.subprogram_id
FROM a
)
OR (
t.argument_name IS NULL
AND t.search_arguments IS NULL
)
)
AND (
(t.package_name, t.module_name, t.subprogram_id) IN (
SELECT s.package_name, s.module_name, s.subprogram_id
FROM s
)
OR (
t.search_source IS NULL
)
);
--
COMMENT ON TABLE obj_modules IS 'Find package modules (procedures and functions) and their boundaries (start-end lines)';
--
COMMENT ON COLUMN obj_modules.package_name IS 'Package name';
COMMENT ON COLUMN obj_modules.module_name IS 'Module name';
COMMENT ON COLUMN obj_modules.overload IS 'Overload ID';
COMMENT ON COLUMN obj_modules.group_name IS 'Group name to have similar modules grouped together';
COMMENT ON COLUMN obj_modules.is_function IS 'Module type (function)';
COMMENT ON COLUMN obj_modules.is_private IS 'Flag for private procedures';
COMMENT ON COLUMN obj_modules.is_autonomous IS 'Contains autonomous transaction';
COMMENT ON COLUMN obj_modules.is_cached IS 'Has RESULT_CACHE activated';
COMMENT ON COLUMN obj_modules.is_definer IS 'Auth as definer';
COMMENT ON COLUMN obj_modules.args_in IS 'Number of IN arguments';
COMMENT ON COLUMN obj_modules.args_out IS 'Number of OUT arguments';
COMMENT ON COLUMN obj_modules.spec_start IS 'Module start in specification';
COMMENT ON COLUMN obj_modules.spec_end IS 'Module end in specification';
COMMENT ON COLUMN obj_modules.spec_lines IS 'Lines in specification';
COMMENT ON COLUMN obj_modules.body_start IS 'Module start in body';
COMMENT ON COLUMN obj_modules.body_end IS 'Module end in body';
COMMENT ON COLUMN obj_modules.count_lines IS 'Lines in body';
COMMENT ON COLUMN obj_modules.comment_ IS 'Description from package spec';

View File

@ -1,13 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_overview AS
SELECT
INITCAP(o.object_type) AS object_type,
COUNT(*) AS count_objects,
--
app_actions.get_object_link(o.object_type) AS page_link
FROM all_objects o
WHERE o.owner = app.get_owner()
AND o.object_type NOT IN ('PACKAGE BODY', 'TABLE PARTITION')
GROUP BY o.object_type;
--
COMMENT ON TABLE obj_overview IS '';

View File

@ -1,28 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_packages AS
SELECT
t.package_name,
--
CASE
WHEN REGEXP_LIKE(t.package_name, '^A\d+$') THEN 'CORE - Application roles...'
WHEN REGEXP_LIKE(t.package_name, '^S\d+$') THEN 'CORE - Application settings'
WHEN t.package_name IN ('APP', 'APP_ACTIONS', 'GEN') THEN 'CORE'
END AS package_group,
--
NULLIF(COUNT(*) - SUM(CASE WHEN t.is_function IS NOT NULL THEN 1 ELSE 0 END), 0) AS count_procedures,
NULLIF(SUM(CASE WHEN t.is_function IS NOT NULL THEN 1 ELSE 0 END), 0) AS count_functions,
--
SUM(t.count_lines) AS count_lines,
SUM(t.count_statements) AS count_statements,
--
MAX(o.last_ddl_time) AS last_ddl_time,
--
NULL AS desc_
FROM obj_modules t
JOIN all_objects o
ON o.owner = t.owner
AND o.object_name = t.package_name
AND o.object_type = 'PACKAGE'
GROUP BY t.package_name;
--
COMMENT ON TABLE obj_packages IS 'List of packages';

View File

@ -1,77 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_packages_settings AS
WITH s AS (
SELECT
s.name AS object_name,
s.type AS object_type,
--
CASE WHEN s.plsql_code_type = 'INTERPRETED' THEN 'Y' END AS is_interpreted,
s.plsql_optimize_level,
--
CASE WHEN s.plscope_settings LIKE '%IDENTIFIERS:ALL%' THEN 'Y' END AS is_scope_identifiers,
CASE WHEN s.plscope_settings LIKE '%STATEMENTS:ALL%' THEN 'Y' END AS is_scope_statements,
--
CASE WHEN s.plsql_warnings LIKE '%ENABLE:INFORMATIONAL%' OR s.plsql_warnings LIKE '%ENABLE:ALL%' THEN 'Y' END AS is_warning_informational,
CASE WHEN s.plsql_warnings LIKE '%ENABLE:PERFORMANCE%' OR s.plsql_warnings LIKE '%ENABLE:ALL%' THEN 'Y' END AS is_warning_performance,
CASE WHEN s.plsql_warnings LIKE '%ENABLE:SEVERE%' OR s.plsql_warnings LIKE '%ENABLE:ALL%' THEN 'Y' END AS is_warning_severe,
--
CASE WHEN s.plsql_debug = 'TRUE' THEN 'Y' END AS is_plsql_debug,
CASE WHEN s.nls_length_semantics = 'CHAR' THEN 'Y' END AS is_nls_char,
--
s.plsql_ccflags
FROM all_plsql_object_settings s
WHERE s.owner = app.get_owner()
AND s.type LIKE 'PACKAGE%'
)
SELECT
CASE
WHEN s.is_interpreted = 'Y'
AND s.plsql_optimize_level <= 2
AND s.is_scope_identifiers = 'Y'
AND s.is_scope_statements = 'Y'
THEN NULL
ELSE app.get_icon('fa-warning', 'This package is not available for analysis')
END AS action_check,
--
s.object_name,
s.object_type,
--
s.is_interpreted,
s.plsql_optimize_level,
s.is_scope_identifiers,
s.is_scope_statements,
s.is_warning_informational,
s.is_warning_performance,
s.is_warning_severe,
s.is_plsql_debug,
s.is_nls_char,
s.plsql_ccflags
FROM s
MINUS
SELECT
CASE
WHEN s.is_interpreted = 'Y'
AND s.plsql_optimize_level <= 2
AND s.is_scope_identifiers = 'Y'
AND s.is_scope_statements = 'Y'
THEN NULL
ELSE app.get_icon('fa-warning', 'This package is not available for analysis')
END AS action_check,
--
s.object_name,
'PACKAGE BODY' AS object_type,
--
s.is_interpreted,
s.plsql_optimize_level,
s.is_scope_identifiers,
s.is_scope_statements,
s.is_warning_informational,
s.is_warning_performance,
s.is_warning_severe,
s.is_plsql_debug,
s.is_nls_char,
s.plsql_ccflags
FROM s
WHERE s.object_type = 'PACKAGE';
--
COMMENT ON TABLE obj_packages_settings IS 'PL/SQL settings related to packages';

View File

@ -1,59 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_partitions AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
p AS (
SELECT /*+ MATERIALIZE */
p.*,
--
'SELECT p.high_value' || CHR(10) ||
'FROM all_tab_partitions p' || CHR(10) ||
'WHERE p.table_owner = ''' || x.owner || '''' || CHR(10) ||
' AND p.table_name = ''' || p.table_name || '''' || CHR(10) ||
' AND p.partition_name = ''' || p.partition_name || '''' AS query_
FROM all_tab_partitions p
JOIN x
ON x.table_name = p.table_name
),
r AS (
SELECT /*+ MATERIALIZE */
p.partition_name,
LTRIM(RTRIM(h.high_value, ' )'), '( ') AS high_value
FROM p,
-- trick to convert LONG to VARCHAR2 on the fly
XMLTABLE('/ROWSET/ROW'
PASSING (DBMS_XMLGEN.GETXMLTYPE(p.query_))
COLUMNS high_value VARCHAR2(4000) PATH 'HIGH_VALUE'
) h
)
SELECT
p.partition_position,
p.partition_name,
p.partition_name AS partition_name_old,
p.high_value,
--
LTRIM(REGEXP_SUBSTR(r.high_value, '[^,' || ']+', 1, 1)) AS header_1,
LTRIM(REGEXP_SUBSTR(r.high_value, '[^,' || ']+', 1, 2)) AS header_2,
LTRIM(REGEXP_SUBSTR(r.high_value, '[^,' || ']+', 1, 3)) AS header_3,
LTRIM(REGEXP_SUBSTR(r.high_value, '[^,' || ']+', 1, 4)) AS header_4,
--
TO_NUMBER(EXTRACTVALUE(XMLTYPE(DBMS_XMLGEN.GETXML(
'SELECT /*+ PARALLEL(p,4) */ COUNT(*) AS r ' ||
'FROM ' || p.table_name || ' PARTITION (' || p.partition_name || ') p'
)), '/ROWSET/ROW/R')) AS count_rows,
--
p.subpartition_count AS subpartitions,
--
p.read_only,
p.read_only AS read_only_old,
--
app.get_icon('fa-trash-o', 'Truncate partition (delete also data)') AS action_truncate
FROM p
JOIN r
ON r.partition_name = p.partition_name;
--
COMMENT ON TABLE obj_partitions IS '';

View File

@ -1,56 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_sequences AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner
FROM DUAL
),
m AS (
-- map sequences to tables (based on column name)
SELECT
c.table_name,
MIN(c.column_name) AS column_name,
s.sequence_name
FROM all_constraints n
JOIN x
ON n.owner = x.owner
JOIN all_cons_columns c
ON c.owner = n.owner
AND c.constraint_name = n.constraint_name
LEFT JOIN all_tab_columns d
ON d.owner = c.owner
AND d.table_name = c.table_name
AND d.column_name = c.column_name
AND d.column_id = 1
AND d.data_type = 'NUMBER'
LEFT JOIN all_sequences s
ON s.sequence_owner = c.owner
AND (
s.sequence_name = c.column_name
OR s.sequence_name = 'SEQ_' || c.table_name
OR s.sequence_name = c.table_name || '_SEQ'
)
WHERE n.constraint_type = 'P'
GROUP BY c.table_name, c.constraint_name, s.sequence_name
HAVING COUNT(c.table_name) = 1
AND MAX(c.position) = 1
AND MAX(d.data_type) = 'NUMBER'
)
SELECT
s.sequence_name,
s.min_value,
s.max_value,
s.increment_by,
NULLIF(s.cycle_flag, 'N') AS cycle_flag,
NULLIF(s.order_flag, 'N') AS order_flag,
s.cache_size,
s.last_number,
m.table_name,
m.column_name
FROM all_sequences s
JOIN x
ON x.owner = s.sequence_owner
LEFT JOIN m
ON m.sequence_name = s.sequence_name;
--
COMMENT ON TABLE obj_sequences IS '';

View File

@ -1,174 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_tables AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_item('$TABLE_NAME') AS table_name,
app.get_dml_owner() AS dml_owner,
--
UPPER(app.get_item('$SEARCH_TABLES')) AS search_tables,
UPPER(app.get_item('$SEARCH_COLUMNS')) AS search_columns,
UPPER(app.get_item('$SEARCH_DATA_TYPE')) AS search_data_type,
app.get_number_item('$SEARCH_SIZE') AS search_size
FROM DUAL
),
c AS (
-- search for tables, columns, data types, count columns, pass table comment
SELECT
c.table_name,
MAX(m.comments) AS comments,
COUNT(*) AS count_cols,
--
MAX(CASE WHEN c.column_name LIKE x.search_columns || '%' ESCAPE '\' THEN 'Y' END) AS is_found_column,
MAX(CASE WHEN c.data_type LIKE x.search_data_type || '%' ESCAPE '\' THEN 'Y' END) AS is_found_data_type,
MAX(CASE WHEN NVL(c.data_precision, c.data_length) = x.search_size THEN 'Y' END) AS is_found_size
FROM user_tab_columns c
LEFT JOIN user_tab_comments m
ON m.table_name = c.table_name
CROSS JOIN x
WHERE c.table_name = NVL(x.table_name, c.table_name)
AND (c.table_name LIKE '%' || x.search_tables || '%' ESCAPE '\' OR x.search_tables IS NULL)
GROUP BY c.table_name
),
n AS (
-- constraints overview
SELECT /*+ MATERIALIZE */
c.table_name,
NULLIF(SUM(CASE WHEN c.constraint_type = 'P' THEN 1 ELSE 0 END), 0) AS count_pk,
NULLIF(SUM(CASE WHEN c.constraint_type = 'U' THEN 1 ELSE 0 END), 0) AS count_uq,
NULLIF(SUM(CASE WHEN c.constraint_type = 'R' THEN 1 ELSE 0 END), 0) AS count_fk
FROM user_constraints c
CROSS JOIN x
WHERE c.table_name = NVL(x.table_name, c.table_name)
AND c.constraint_type IN ('P', 'U', 'R')
GROUP BY c.table_name
),
i AS (
-- indexes overview
SELECT /*+ MATERIALIZE */
i.table_name,
COUNT(i.table_name) AS count_ix
FROM user_indexes i
CROSS JOIN x
LEFT JOIN user_constraints c
ON c.constraint_name = i.index_name
WHERE i.table_name = NVL(x.table_name, i.table_name)
AND i.index_type != 'LOB'
AND c.constraint_name IS NULL
GROUP BY i.table_name
),
g AS (
-- triggers overview
SELECT /*+ MATERIALIZE */
g.table_name,
COUNT(g.table_name) AS count_trg
FROM user_triggers g
CROSS JOIN x
WHERE g.table_name = NVL(x.table_name, g.table_name)
GROUP BY g.table_name
),
p AS (
-- partitions count
SELECT /*+ MATERIALIZE */
p.table_name,
COUNT(*) AS partitions
FROM user_tab_partitions p
CROSS JOIN x
WHERE p.table_name = NVL(x.table_name, p.table_name)
GROUP BY p.table_name
),
d AS (
-- dml tables
SELECT
t.table_name,
a.table_name AS dml_handler,
NULLIF(COUNT(i.line), 0) AS count_references
FROM all_tables a
JOIN x
ON x.dml_owner = a.owner
JOIN user_tables t
ON a.table_name = app.get_dml_table(t.table_name)
LEFT JOIN user_identifiers i
ON i.object_type = 'PACKAGE BODY'
AND i.name = a.table_name
AND i.type = 'TABLE'
GROUP BY t.table_name, a.table_name
),
m AS (
SELECT /*+ MATERIALIZE */
m.mview_name
FROM user_mviews m
)
--
SELECT
t.table_name,
c.count_cols,
t.num_rows AS count_rows,
--
CASE
WHEN c.comments LIKE '[%]%'
THEN REGEXP_SUBSTR(c.comments, '^\[([^]]+)\]', 1, 1, NULL, 1)
ELSE REGEXP_SUBSTR(t.table_name, '^[^_]+')
END AS table_group,
--
CASE WHEN n.count_pk IS NOT NULL THEN 'Y' END AS is_pk,
CASE WHEN n.count_uq IS NOT NULL THEN 'Y' END AS is_uq,
--
n.count_fk,
i.count_ix,
g.count_trg,
--
p.partitions AS count_partitions,
d.count_references AS dml_references,
d.dml_handler,
--
CASE WHEN d.table_name IS NOT NULL THEN 'Y' END AS is_dml_handler,
CASE WHEN t.temporary = 'Y' THEN 'Y' END AS is_temp,
CASE WHEN t.iot_type = 'IOT' THEN 'Y' END AS is_iot,
CASE WHEN t.row_movement = 'ENABLED' THEN 'Y' END AS is_row_mov,
CASE WHEN t.read_only = 'YES' THEN 'Y' END AS is_read_only,
--
o.last_ddl_time,
TRUNC(SYSDATE) - TRUNC(t.last_analyzed) AS last_analyzed, -- in days
--
LTRIM(RTRIM(REGEXP_REPLACE(c.comments, '^\[[^]]+\]\s*', ''))) AS comments,
--
t.avg_row_len,
--
ROUND(t.blocks * 8, 2) AS fragmented_kb,
ROUND(t.num_rows * t.avg_row_len / 1024, 2) AS actual_kb,
--
CASE
WHEN ROUND(t.blocks * 8, 2) > 0
THEN ROUND(t.blocks * 8, 2) - ROUND(t.num_rows * t.avg_row_len / 1024, 2)
END AS wasted_kb,
--
CASE
WHEN ROUND(t.blocks * 8, 2) > 0 AND ROUND(t.num_rows * t.avg_row_len / 1024, 2) > 0
THEN FLOOR((ROUND(t.blocks * 8, 2) - ROUND(t.num_rows * t.avg_row_len / 1024, 2)) / ROUND(t.blocks * 8, 2) * 100)
END AS wasted_perc,
--
t.cache,
t.result_cache,
t.buffer_pool
FROM user_tables t
JOIN user_objects o
ON o.object_name = t.table_name
AND o.object_type = 'TABLE' -- skip views
CROSS JOIN x
JOIN c ON c.table_name = t.table_name
--
LEFT JOIN n ON n.table_name = t.table_name
LEFT JOIN i ON i.table_name = t.table_name
LEFT JOIN g ON g.table_name = t.table_name
LEFT JOIN p ON p.table_name = t.table_name
LEFT JOIN d ON d.table_name = t.table_name
LEFT JOIN m ON m.mview_name = t.table_name -- skip mviews
--
WHERE t.table_name = NVL(x.table_name, t.table_name)
AND t.table_name != app.get_dml_table(t.table_name)
AND m.mview_name IS NULL
AND (c.is_found_column = 'Y' OR x.search_columns IS NULL)
AND (c.is_found_data_type = 'Y' OR x.search_data_type IS NULL)
AND (c.is_found_size = 'Y' OR x.search_size IS NULL);
--
COMMENT ON TABLE obj_tables IS '';

View File

@ -1,44 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_tables_ref_down AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
t AS (
SELECT
r.table_name,
p.table_name AS referenced_table,
p.constraint_name AS primary_key_name,
r.constraint_name AS foreign_key_name
FROM all_constraints r
JOIN x
ON x.owner = r.owner
JOIN all_constraints p
ON r.r_constraint_name = p.constraint_name
AND r.constraint_type = 'R'
WHERE p.constraint_type = 'P'
)
SELECT
t.table_name AS table_name_,
t.table_name,
NULL AS foreign_key_name,
NULL AS primary_key_name
FROM all_tables t
JOIN x
ON x.owner = t.owner
AND x.table_name = t.table_name
UNION ALL
--
SELECT
t.table_name AS table_name_,
--
'<span style="margin-left: ' || (LEVEL * 2) || 'rem;">' || t.table_name || '</span>' AS table_name,
'<span style="margin-left: ' || (LEVEL * 2) || 'rem;">' || t.foreign_key_name || '</span>' AS foreign_key_name,
t.primary_key_name
FROM t
CONNECT BY NOCYCLE t.referenced_table = PRIOR t.table_name
START WITH t.referenced_table = (SELECT x.table_name FROM x);
--
COMMENT ON TABLE obj_tables_ref_down IS '';

View File

@ -1,21 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_tables_ref_objects AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_app_id() AS app_id,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
)
SELECT
'<span style="margin-left: 2rem;">' || d.name || '</SPAN>' AS ref_name,
LISTAGG(d.type, ', ') WITHIN GROUP (ORDER BY d.type) AS ref_type,
--
app_actions.get_object_link(REPLACE(MIN(d.type), ' BODY', ''), d.name) AS ref_link
FROM all_dependencies d
JOIN x
ON x.owner = d.referenced_owner
AND x.table_name = d.referenced_name
GROUP BY d.name;
--
COMMENT ON TABLE obj_tables_ref_objects IS '';

View File

@ -1,44 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_tables_ref_pages AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_app_id() AS app_id,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
)
SELECT
r.page_id,
r.page_id || ' - ' || p.page_title || ', ' || r.region_name AS page_name,
r.table_name AS supplemental_info,
--
CASE WHEN r.table_name = x.table_name
THEN r.page_id
END AS list_badge,
--
CASE WHEN r.table_name = x.table_name
THEN 0
ELSE ROW_NUMBER() OVER (ORDER BY r.page_id, r.region_name) END AS sort# ------- order#
FROM apex_application_page_regions r
JOIN apex_application_pages p
ON p.application_id = r.application_id
AND p.page_id = r.page_id
JOIN x
ON x.app_id = r.application_id
WHERE r.query_type_code = 'TABLE'
AND (
r.table_name = x.table_name
OR r.table_name IN (
SELECT DISTINCT d.name AS view_name
FROM all_dependencies d
JOIN x
ON x.owner = d.referenced_owner
AND d.type = 'VIEW'
CONNECT BY NOCYCLE d.referenced_name = PRIOR d.name
AND d.referenced_type = 'VIEW'
START WITH d.referenced_name = x.table_name
AND d.referenced_type = 'TABLE'
)
);
--
COMMENT ON TABLE obj_tables_ref_pages IS '';

View File

@ -1,45 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_tables_ref_up AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$TABLE_NAME') AS table_name
FROM DUAL
),
t AS (
SELECT
r.table_name,
p.table_name AS referenced_table,
p.constraint_name AS primary_key_name,
r.constraint_name AS foreign_key_name
FROM all_constraints r
JOIN all_constraints p
ON r.owner = p.owner
AND r.r_constraint_name = p.constraint_name
AND r.constraint_type = 'R'
JOIN x
ON x.owner = p.owner
WHERE p.constraint_type = 'P'
)
SELECT
t.table_name AS table_name_,
t.table_name,
NULL AS foreign_key_name,
NULL AS primary_key_name
FROM all_tables t
JOIN x
ON x.owner = t.owner
AND x.table_name = t.table_name
UNION ALL
--
SELECT
t.referenced_table AS table_name_,
--
'<span style="margin-left: ' || (LEVEL * 2) || 'rem;">' || t.referenced_table || '</span>' AS table_name,
'<span style="margin-left: ' || (LEVEL * 2) || 'rem;">' || t.foreign_key_name || '</span>' AS foreign_key_name,
t.primary_key_name
FROM t
CONNECT BY NOCYCLE PRIOR t.referenced_table = t.table_name
START WITH t.table_name = (SELECT x.table_name FROM x);
--
COMMENT ON TABLE obj_tables_ref_up IS '';

View File

@ -1,89 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_triggers AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_app_id() AS app_id,
app.get_item('$TABLE_NAME') AS table_name,
app.get_item('$TRIGGER_NAME') AS trigger_name,
app.get_date_item('G_TODAY') AS today
FROM DUAL
),
r AS (
SELECT /* materialize */
l.action_name AS table_name,
COUNT(l.log_id) AS count_calls,
SUM(TO_NUMBER(REGEXP_SUBSTR(l.arguments, '"inserted":"?(\d+)', 1, 1, NULL, 1))) AS count_inserted,
SUM(TO_NUMBER(REGEXP_SUBSTR(l.arguments, '"updated":"?(\d+)', 1, 1, NULL, 1))) AS count_updated,
SUM(TO_NUMBER(REGEXP_SUBSTR(l.arguments, '"deleted":"?(\d+)', 1, 1, NULL, 1))) AS count_deleted
FROM x
JOIN logs l
ON l.created_at >= x.today
AND l.created_at < x.today + 1
AND l.app_id = x.app_id
AND l.flag = 'G'
AND l.action_name = NVL(x.table_name, l.action_name)
GROUP BY l.action_name
)
SELECT
t.table_name,
--
CASE
WHEN c.comments LIKE '[%]%'
THEN REGEXP_SUBSTR(c.comments, '^\[([^]]+)\]', 1, 1, NULL, 1)
ELSE REGEXP_SUBSTR(t.table_name, '^[^_]+')
END AS table_group,
--
g.trigger_name,
g.trigger_type,
g.base_object_type,
--
CASE WHEN g.when_clause IS NOT NULL THEN 'Y' END AS is_when,
CASE WHEN g.status != 'ENABLED' THEN 'Y' END AS is_disabled,
CASE WHEN g.instead_of_row = 'YES' THEN 'Y' END AS is_instead_of,
CASE WHEN g.before_statement = 'YES' THEN 'Y' END AS is_before_statement,
CASE WHEN g.before_row = 'YES' THEN 'Y' END AS is_before_row,
CASE WHEN g.after_row = 'YES' THEN 'Y' END AS is_after_row,
CASE WHEN g.after_statement = 'YES' THEN 'Y' END AS is_after_statement,
--
CASE
WHEN g.trigger_name = t.table_name || '__' -- default trigger name
AND g.trigger_type = 'COMPOUND'
AND g.triggering_event = 'INSERT OR UPDATE OR DELETE'
AND g.before_statement = 'YES'
AND g.before_row = 'YES'
AND g.after_row = 'YES'
AND g.after_statement = 'YES'
AND g.status = 'ENABLED'
THEN 'Y'
END AS is_valid,
--
r.count_calls,
r.count_inserted,
r.count_updated,
r.count_deleted,
--
o.last_ddl_time
FROM all_tables t
JOIN x
ON x.owner = t.owner
LEFT JOIN all_triggers g
ON g.owner = x.owner
AND g.table_name = t.table_name
AND g.trigger_name = NVL(x.trigger_name, g.trigger_name)
LEFT JOIN all_objects o
ON o.owner = g.owner
AND o.object_name = g.trigger_name
LEFT JOIN all_mviews v
ON v.owner = t.owner
AND v.mview_name = t.table_name
LEFT JOIN r
ON r.table_name = g.table_name
LEFT JOIN all_tab_comments c
ON c.owner = t.owner
AND c.table_name = t.table_name
WHERE t.table_name = NVL(x.table_name, t.table_name)
AND t.table_name != app.get_dml_table(t.table_name)
AND v.mview_name IS NULL;
--
COMMENT ON TABLE obj_triggers IS '';

View File

@ -1,74 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_view_columns AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_item('$VIEW_NAME') AS view_name,
--
UPPER(app.get_item('$SEARCH_VIEWS')) AS search_views,
UPPER(app.get_item('$SEARCH_COLUMNS')) AS search_columns
--UPPER(app.get_item('$SEARCH_DATA_TYPE')) AS search_data_type,
--app.get_number_item('$SEARCH_SIZE') AS search_size
FROM DUAL
),
c AS (
SELECT
c.table_name AS view_name,
c.column_id,
c.column_name,
--
c.data_type ||
CASE
WHEN c.data_type LIKE '%CHAR%' OR c.data_type = 'RAW' THEN
DECODE(NVL(c.char_length, 0), 0, '',
'(' || c.char_length || DECODE(c.char_used, 'C', ' CHAR', '') || ')'
)
WHEN c.data_type = 'NUMBER' THEN
DECODE(NVL(c.data_precision || c.data_scale, 0), 0, '',
DECODE(NVL(c.data_scale, 0), 0, '(' || c.data_precision || ')',
'(' || c.data_precision || ',' || c.data_scale || ')'
)
)
END AS data_type,
--
c.nullable,
c.data_default,
c.avg_col_len,
--
CASE WHEN c.column_name LIKE x.search_columns || '%' ESCAPE '\' THEN 'Y' END AS is_found_column
--CASE WHEN c.data_type LIKE x.search_data_type || '%' ESCAPE '\' THEN 'Y' END AS is_found_data_type,
--CASE WHEN NVL(c.data_precision, c.data_length) = x.search_size THEN 'Y' END AS is_found_size
FROM all_tab_columns c
JOIN x
ON x.owner = c.owner
JOIN all_views t
ON t.owner = c.owner
AND t.view_name = c.table_name
WHERE t.view_name = NVL(x.view_name, t.view_name)
AND t.view_name != app.get_dml_table(t.view_name)
AND (c.table_name LIKE '%' || x.search_views || '%' ESCAPE '\' OR x.search_views IS NULL)
)
SELECT
c.view_name,
c.column_id,
c.column_name,
c.column_name AS column_name_old,
c.data_type,
c.data_default,
c.avg_col_len AS avg_length,
--
CASE WHEN c.nullable = 'N' THEN 'Y' END AS is_nn,
--
m.comments
FROM c
CROSS JOIN x
LEFT JOIN all_col_comments m
ON m.owner = x.owner
AND m.table_name = c.view_name
AND m.column_name = c.column_name
WHERE 1 = 1
AND (c.is_found_column = 'Y' OR x.search_columns IS NULL)
--AND (c.is_found_data_type = 'Y' OR x.search_data_type IS NULL)
--AND (c.is_found_size = 'Y' OR x.search_size IS NULL);
--
COMMENT ON TABLE obj_view_columns IS '';

View File

@ -1,145 +0,0 @@
CREATE OR REPLACE FORCE VIEW obj_views AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner,
app.get_app_id() AS app_id,
app.get_core_app_id() AS core_app_id,
app.get_item('$VIEW_NAME') AS view_name,
--
UPPER(app.get_item('$SEARCH_VIEWS')) AS search_views,
UPPER(app.get_item('$SEARCH_COLUMNS')) AS search_columns,
LOWER(app.get_item('$SEARCH_SOURCE')) AS search_source
FROM DUAL
),
r AS (
SELECT /*+ MATERIALIZE */
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 nav.get_html_a(app_actions.get_object_link(d.referenced_type, d.referenced_name), d.referenced_name) END, ', ')
WITHIN GROUP (ORDER BY d.referenced_name)
AS referenced_tables,
--
LISTAGG(CASE WHEN d.referenced_type = 'VIEW'
THEN nav.get_html_a(app_actions.get_object_link(d.referenced_type, d.referenced_name), d.referenced_name) END, ', ')
WITHIN GROUP (ORDER BY d.referenced_name)
AS referenced_views
FROM all_dependencies d
JOIN x
ON x.owner = d.owner
WHERE d.type = 'VIEW'
AND d.name = NVL(x.view_name, d.name)
AND (d.name LIKE '%' || x.search_views || '%' ESCAPE '\' OR x.search_views IS NULL)
GROUP BY d.name
),
u AS (
SELECT /*+ MATERIALIZE */
d.referenced_name AS view_name,
--
LISTAGG(nav.get_html_a(app_actions.get_object_link(d.type, d.name), d.name), ', ')
WITHIN GROUP (ORDER BY d.name) AS used_in_objects
FROM all_dependencies d
JOIN x
ON x.owner = d.owner
WHERE d.referenced_type = 'VIEW'
GROUP BY d.referenced_name
),
p AS (
SELECT /*+ MATERIALIZE */
r.table_name,
LISTAGG(DISTINCT nav.get_html_a(app.get_page_url(910, 'P910_PAGE_ID', r.page_id), r.page_id), ', ')
WITHIN GROUP (ORDER BY r.page_id) AS used_on_pages
FROM apex_application_page_regions r
JOIN x
ON x.app_id = r.application_id
WHERE r.query_type_code = 'TABLE'
GROUP BY r.table_name
),
s AS (
SELECT /*+ MATERIALIZE */
s.name AS view_name,
COUNT(s.line) AS count_lines,
--
MAX(CASE WHEN LOWER(s.text) LIKE '%' || x.search_source || '%' ESCAPE '\' THEN 'Y' END) AS is_found_text
FROM obj_views_source s
JOIN x
ON x.owner = s.owner
GROUP BY s.name
),
v AS (
SELECT /*+ MATERIALIZE */
v.view_name,
v.read_only,
v.bequeath,
o.last_ddl_time
FROM all_views v
JOIN all_objects o
ON o.owner = v.owner
AND o.object_name = v.view_name
AND o.object_type = 'VIEW'
JOIN x
ON x.owner = v.owner
WHERE v.view_name = NVL(x.view_name, v.view_name)
AND (v.view_name LIKE '%' || x.search_views || '%' ESCAPE '\' OR x.search_views IS NULL)
),
c AS (
SELECT /*+ MATERIALIZE */
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,
--
MAX(CASE WHEN c.column_name LIKE x.search_columns || '%' ESCAPE '\' THEN 'Y' END) AS is_found_column
FROM all_tab_cols c
JOIN x
ON x.owner = c.owner
WHERE c.table_name = NVL(x.view_name, c.table_name)
AND (c.table_name LIKE '%' || x.search_views || '%' ESCAPE '\' OR x.search_views IS NULL)
GROUP BY c.table_name
)
SELECT
CASE
WHEN c.comments LIKE '[%]%'
THEN REGEXP_SUBSTR(c.comments, '^\[([^]]+)\]', 1, 1, NULL, 1)
ELSE REGEXP_SUBSTR(REGEXP_REPLACE(v.view_name, '^P\d+$', 'PAGE#'), '^[^_]+')
END ||
CASE WHEN REGEXP_SUBSTR(REGEXP_REPLACE(v.view_name, '^P\d+$', 'PAGE#'), '^[^_]+') = 'OBJ'
AND p.used_on_pages IS NOT NULL
THEN ' - ' || app.get_page_title(REGEXP_REPLACE(p.used_on_pages, '<.*?>', ''), x.core_app_id)
END AS view_group,
--
v.view_name,
--
c.count_columns,
c.list_columns,
s.count_lines,
--
u.used_in_objects,
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,
LTRIM(RTRIM(REGEXP_REPLACE(c.comments, '^\[[^]]+\]\s*', ''))) AS comments,
--
v.last_ddl_time
FROM v
CROSS JOIN x
JOIN c ON c.view_name = v.view_name
LEFT JOIN r ON r.view_name = v.view_name
LEFT JOIN u ON u.view_name = v.view_name
LEFT JOIN p ON p.table_name = v.view_name
LEFT JOIN s ON s.view_name = v.view_name
LEFT JOIN all_tab_comments c
ON c.owner = x.owner
AND c.table_name = v.view_name
--
WHERE (c.is_found_column = 'Y' OR x.search_columns IS NULL)
AND (s.is_found_text = 'Y' OR x.search_source IS NULL);
--
COMMENT ON TABLE obj_views IS '';

View File

@ -42,7 +42,7 @@ v AS (
COUNT(*) AS references
FROM (
SELECT REPLACE(RTRIM(REGEXP_SUBSTR(UPPER(s.text), x.package_name || '\.' || REPLACE(x.prefix, '_', '\_') || '[^(]*')), x.package_name || '.', '') AS procedure_name
FROM obj_views_source s
FROM source_lines s
JOIN x
ON x.owner = s.owner
WHERE UPPER(s.text) LIKE '%' || x.package_name || '.' || x.prefix || '%'