Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eeffe12c9a | ||
|
|
67bb97ae8a | ||
|
|
3ba440705e | ||
|
|
cc9429c3e1 | ||
|
|
2418416b9a | ||
|
|
728f3baf97 | ||
|
|
50ebe0180d | ||
|
|
fb702e6702 | ||
|
|
f878e6865b | ||
|
|
34871a7dfc | ||
|
|
e7c8ab53a2 | ||
|
|
0536ece55a | ||
|
|
1648d5dc8a | ||
|
|
2bb36d612e | ||
|
|
6c2e24f48e | ||
|
|
9bd06fdd55 | ||
|
|
54ab201504 |
@ -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;
|
||||
|
||||
@ -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;
|
||||
--
|
||||
|
||||
@ -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
|
||||
);
|
||||
--
|
||||
|
||||
86
database/mviews/nav_source_pages_mv.sql
Normal file
86
database/mviews/nav_source_pages_mv.sql
Normal 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);
|
||||
|
||||
35
database/mviews/nav_source_sorted_mv.sql
Normal file
35
database/mviews/nav_source_sorted_mv.sql
Normal 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);
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
);
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
--
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
--
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"';
|
||||
|
||||
@ -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';
|
||||
|
||||
|
||||
20
database/tables/setting_colors.sql
Normal file
20
database/tables/setting_colors.sql
Normal 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';
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
17
database/tables/source_lines.sql
Normal file
17
database/tables/source_lines.sql
Normal 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';
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
--
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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';
|
||||
--
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 '';
|
||||
|
||||
@ -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 || '%'
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user