CORE/views/obj_packages.sql
2022-03-07 06:32:47 +01:00

64 lines
2.0 KiB
SQL

CREATE OR REPLACE VIEW obj_packages AS
WITH x AS (
SELECT /*+ MATERIALIZE */
app.get_owner() AS owner
FROM DUAL
),
s AS (
SELECT /*+ MATERIALIZE */
s.owner,
s.name AS package_name,
COUNT(s.line) AS count_lines
FROM all_source s
JOIN x
ON x.owner = s.owner
AND s.type = 'PACKAGE BODY'
JOIN obj_modules m
ON m.package_name = s.name
GROUP BY s.owner, s.name
),
f AS (
SELECT /*+ MATERIALIZE */
a.package_name,
SUM(CASE WHEN a.position = 0 THEN 1 ELSE 0 END) AS count_functions
FROM s
LEFT JOIN all_arguments a
ON a.owner = s.owner
AND a.package_name = s.package_name
GROUP BY a.package_name
)
SELECT
p.object_name AS package_name,
--
CASE
WHEN REGEXP_LIKE(p.object_name, '^A\d+$') THEN 'CORE - Application roles...'
WHEN REGEXP_LIKE(p.object_name, '^S\d+$') THEN 'CORE - Application settings'
WHEN p.object_name IN ('APP', 'APP_ACTIONS', 'GEN') THEN 'CORE'
END AS package_group,
--
NULLIF(COUNT(p.procedure_name) - MIN(f.count_functions), 0) AS count_procedures,
--
NULLIF(MIN(f.count_functions), 0) AS count_functions,
MAX(s.count_lines) AS count_lines,
MAX(o.last_ddl_time) AS last_ddl_time,
--
-- @TODO: dependencies?
-- @TODO: references?
--
NULL AS desc_ -- @TODO: get from specification
FROM all_objects o
JOIN all_procedures p
ON p.owner = o.owner
AND p.object_name = o.object_name
JOIN s
ON s.owner = p.owner
AND s.package_name = p.object_name
JOIN f
ON f.package_name = p.object_name
WHERE o.owner = s.owner
AND o.object_type = 'PACKAGE'
GROUP BY p.object_name;
--
COMMENT ON TABLE obj_packages IS 'List of packages';