138 lines
6.0 KiB
MySQL
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;
|
|
/
|
|
|