D
Did you ever wondered how (where) are your variables used? This script show usage of local variables, constants and input parameters in packages. You can use it for example for finding unused variables (and removing them). It is based on user_identifiers view/feature and you should check previous article first if it is new for you.
WITH x (object_type, object_name) AS (
SELECT 'PACKAGE BODY', '%' FROM DUAL
),
i AS (
SELECT i.*
FROM x
JOIN user_identifiers i
ON i.object_type = x.object_type
AND i.object_name LIKE x.object_name
)
SELECT
a.object_name,
b.name AS module_name,
REPLACE(a.type, 'FORMAL ') AS variable_type,
a.name AS variable_name,
REGEXP_REPLACE(
REGEXP_SUBSTR(s.text, '(' || a.name || ')([^;:]*)', 1, 1, 'i'),
'\s*(' || a.name || ')\s+(.*)',
'\2', 1, 1, 'i'
) AS data_type,
CASE WHEN r.lines IS NULL
THEN 'Y'
END AS unused,
a.line AS declaration,
r.lines AS references,
a.signature
FROM i a
JOIN i b
ON b.object_name = a.object_name
AND b.object_type = a.object_type
AND b.usage_id = a.usage_context_id
AND b.type IN ('FUNCTION', 'PROCEDURE')
AND a.type IN ('VARIABLE', 'FORMAL IN', 'CONSTANT')
AND a.usage = 'DECLARATION'
JOIN user_source s
ON s.name = a.object_name
AND s.type = a.object_type
AND s.line = a.line
LEFT JOIN (
-- this may have some duplicite numbers because you can reference same variable on same row multiple times
SELECT
i.signature,
LISTAGG(i.line, ', ') WITHIN GROUP (ORDER BY i.line) AS lines
FROM i
WHERE i.usage IN ('REFERENCE', 'DEFINITION', 'ASSIGNMENT')
GROUP BY i.signature
) r
ON r.signature = a.signature
ORDER BY a.object_name, a.line, a.name;
And if you know signiture you can explore it row by row.
SELECT i.* FROM user_identifiers i WHERE i.signature = 'A128FBAA77D03FF310CD0BA476D514DA';
Comments
Post a Comment