CORE/procedures/recompile.sql
2021-12-18 09:40:41 +01:00

138 lines
6.0 KiB
MySQL

CREATE OR REPLACE PROCEDURE recompile (
in_filter_type VARCHAR2 := '%',
in_filter_name VARCHAR2 := '%',
in_code_type VARCHAR2 := 'INTERPRETED',
in_scope VARCHAR2 := 'IDENTIFIERS:ALL, STATEMENTS:ALL',
in_warnings VARCHAR2 := 'ENABLE:SEVERE, ENABLE:PERFORMANCE',
in_optimize NUMBER := 2,
in_ccflags VARCHAR2 := NULL,
in_invalid_only BOOLEAN := TRUE
) AS
in_invalids CONSTANT CHAR := CASE WHEN in_invalid_only THEN 'Y' END;
ccflags VARCHAR2(32767);
query_ VARCHAR2(32767);
invalids PLS_INTEGER;
BEGIN
/**
* This procedure is part of the Kvido project under MIT licence.
* https://github.com/jkvetina/Kvido
*
* Copyright (c) Jan Kvetina, 2021
*
* (R)
* --- ---
* #@@@@@@ &@@@@@@
* @@@@@@@@ .@ @@@@@@@@
* ----- @@@@@@ @@@@@@, @@@@@@@ -----
* &@@@@@@@@@@@ @@@ &@@@@@@@@@. @@@@ .@@@@@@@@@@@#
* @@@@@@@@@@@ @ @@@@@@@@@@@@@ @ @@@@@@@@@@@
* /@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@
* @@@@@@@@@ @@@@@@@@@@@@@@@ &@@@@@@@@
* @@@@@@@( @@@@@@@@@@@@@@@ @@@@@@@@
* @@@@@@( @@@@@@@@@@@@@@ @@@@@@@
* .@@@@@, @@@@@@@@@@@@@ @@@@@@
* @@@@@@ *@@@@@@@@@@@@@ @@@@@@
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@
* ,@@@@@@@@@@@@@@@@@@@@@@@@@
* ,@@@@@@@@@@@@@@@@@@@@@
* jankvetina.cz
* -------
*
*/
-- first recompile invalid and requested objects
DBMS_OUTPUT.PUT_LINE('--');
DBMS_OUTPUT.PUT('INVALID: ');
--
FOR c IN (
SELECT o.object_name, o.object_type
FROM user_objects o
WHERE o.status != 'VALID'
AND o.object_type NOT IN ('SEQUENCE', 'MATERIALIZED VIEW')
AND o.object_name != $$PLSQL_UNIT -- not this procedure
UNION ALL
SELECT o.object_name, o.object_type
FROM user_objects o
WHERE in_invalids IS NULL
AND o.object_type IN ('PACKAGE', 'PACKAGE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER', 'VIEW', 'SYNONYM')
AND (o.object_type LIKE in_filter_type OR in_filter_type IS NULL)
AND (o.object_name LIKE in_filter_name OR in_filter_name IS NULL)
AND o.object_name != $$PLSQL_UNIT -- not this procedure
) LOOP
-- apply ccflags only relevant to current object
IF in_ccflags IS NOT NULL THEN
BEGIN
SELECT
LISTAGG(REGEXP_SUBSTR(in_ccflags, '(' || s.flag_name || ':[^,]+)', 1, 1, NULL, 1), ', ')
WITHIN GROUP (ORDER BY s.flag_name)
INTO ccflags
FROM (
SELECT DISTINCT REGEXP_SUBSTR(s.text, '[$].*\s[$][$]([A-Z0-9-_]+)\s.*[$]', 1, 1, NULL, 1) AS flag_name
FROM user_source s
WHERE REGEXP_LIKE(s.text, '[$].*\s[$][$][A-Z0-9-_]+\s.*[$]')
AND s.name = c.object_name
AND s.type = c.object_type
) s;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ccflags := NULL;
END;
END IF;
--
BEGIN
query_ := 'ALTER ' || REPLACE(c.object_type, ' BODY', '') || ' ' || c.object_name || ' COMPILE' ||
CASE WHEN c.object_type LIKE '% BODY' THEN ' BODY' END || ' ' ||
CASE WHEN c.object_type IN (
'PACKAGE', 'PACKAGE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER'
) THEN
CASE WHEN ccflags IS NOT NULL THEN 'PLSQL_CCFLAGS = ''' || RTRIM(ccflags) || ''' ' END ||
CASE WHEN in_code_type IS NOT NULL THEN 'PLSQL_CODE_TYPE = ' || in_code_type || ' ' END ||
CASE WHEN in_optimize IS NOT NULL THEN 'PLSQL_OPTIMIZE_LEVEL = ' || in_optimize || ' ' END ||
CASE WHEN in_warnings IS NOT NULL THEN 'PLSQL_WARNINGS = ''' || REPLACE(in_warnings, ',', ''', ''') || ''' ' END ||
CASE WHEN in_scope IS NOT NULL THEN 'PLSCOPE_SETTINGS = ''' || RTRIM(in_scope) || ''' ' END ||
'REUSE SETTINGS'
END;
--
EXECUTE IMMEDIATE query_;
--DBMS_OUTPUT.PUT_LINE(query_);
DBMS_OUTPUT.PUT('.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT('!'); -- something went wrong
END;
END LOOP;
-- show number of invalid objects
SELECT COUNT(*) INTO invalids
FROM user_objects o
WHERE o.status != 'VALID'
AND o.object_type != 'MATERIALIZED VIEW'
AND o.object_name != $$PLSQL_UNIT; -- not this procedure
--
DBMS_OUTPUT.PUT_LINE(' -> ' || invalids);
DBMS_OUTPUT.PUT_LINE('');
-- list invalid objects
IF invalids > 0 THEN
FOR c IN (
SELECT object_type, LISTAGG(object_name, ', ') WITHIN GROUP (ORDER BY object_name) AS objects
FROM (
SELECT DISTINCT o.object_type, o.object_name
FROM user_objects o
WHERE o.status != 'VALID'
AND o.object_type != 'MATERIALIZED VIEW'
ORDER BY o.object_type, o.object_name
)
GROUP BY object_type
ORDER BY object_type
) LOOP
DBMS_OUTPUT.PUT_LINE(' ' || RPAD(c.object_type || ':', 15, ' ') || ' ' || c.objects);
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
END IF;
END;
/