Issue
During an Oracle advanced installation, package compilation fails with errors such as:
ORA-04063: package body "FMEMC.MC_SETTINGS" has errors
ORA-06508: PL/SQL: could not find program unit being called
or:
PLS-00201: identifier 'DBMS_LOCK' must be declared
Cause
These errors are typically caused by:
- missing Oracle privileges for the
FMEMCschema - missing synonyms for required Oracle packages and views
As a result, package bodies (e.g. MC_UTIL, MC_SETTINGS) cannot compile.
This situation occurs most often in advanced/manual installations, where required grants are not applied automatically.
For the full list of required privileges, see:
https://docs.migration-center.com/database-administrators-guide#oracle-privileges
Symptoms
- Invalid package bodies in schema
FMEMC - Errors referencing Oracle packages like:
DBMS_LOCKDBMS_SCHEDULER
-
PLS-00201(identifier must be declared) -
ORA-06508(program unit not found)
Diagnosis
1. Check object privileges (connected as user FMEMC)
SELECT table_name, grantee, privilege
FROM user_tab_privs
WHERE grantee = 'FMEMC'
ORDER BY table_name;
The result should be:
2. Check synonyms (connected as user FMEMC)
SELECT synonym_name, table_owner, table_name
FROM user_synonyms
The result should be:
Typical missing synonym example:
-
DBMS_LOCK→ causesPLS-00201 -
Missing FMEMC.V$INSTANCE synonym FOR SYS.V_$INSTANCE→ causesORA-04063: package body "FMEMC.MC_SETTINGS" has errors
3. Check invalid objects (connected as user FMEMC)
SELECT object_name, object_type, status
FROM user_objects
WHERE status <> 'VALID';
Resolution
Apply missing grants and create required synonyms, then recompile packages.
1. Grants (connected as user SYS)
Execute the commands bellow connected as user SYS.
GRANT CONNECT,RESOURCE, DBA TO FMEMC;
GRANT CREATE JOB TO FMEMC;
GRANT CREATE VIEW TO FMEMC;
GRANT SELECT ON SYS.V_$INSTANCE TO FMEMC;
GRANT EXECUTE ON SYS.UTL_TCP TO FMEMC;
GRANT EXECUTE ON SYS.UTL_SMTP TO FMEMC;
GRANT EXECUTE ON SYS.DBMS_LOCK TO FMEMC;
GRANT EXECUTE ON SYS.UTL_RAW TO FMEMC;
GRANT EXECUTE ON SYS.UTL_ENCODE TO FMEMC;
GRANT EXECUTE ON SYS.DBMS_SCHEDULER TO FMEMC;
GRANT EXECUTE ON SYS.DBMS_CRYPTO TO FMEMC;
2. Synonyms (connected as user SYS)
CREATE OR REPLACE SYNONYM FMEMC.UTL_TCP FOR SYS.UTL_TCP;
CREATE OR REPLACE SYNONYM FMEMC.UTL_SMTP FOR SYS.UTL_SMTP;
CREATE OR REPLACE SYNONYM FMEMC.DBMS_LOCK FOR SYS.DBMS_LOCK;
CREATE OR REPLACE SYNONYM FMEMC.UTL_RAW FOR SYS.UTL_RAW;
CREATE OR REPLACE SYNONYM FMEMC.UTL_ENCODE FOR SYS.UTL_ENCODE;
CREATE OR REPLACE SYNONYM FMEMC.DBMS_SCHEDULER FOR SYS.DBMS_SCHEDULER;
CREATE OR REPLACE SYNONYM FMEMC.DBMS_CRYPTO FOR SYS.DBMS_CRYPTO;
CREATE OR REPLACE SYNONYM FMEMC.V$INSTANCE FOR SYS.V_$INSTANCE;
3. Recompile packages (connected as user FMEMC)
ALTER PACKAGE FMEMC.MC_UTIL COMPILE BODY;
ALTER PACKAGE FMEMC.MC_SETTINGS COMPILE BODY;
Alternatively you compile all FMEMC packages in Oracle SQL Developer (right click on Packages node).
Verification (connected as user FMEMC)
- No invalid objects:
SELECT * FROM user_objects
WHERE status <> 'VALID';
- Required privileges exist
- Required synonyms exist
Comments
0 comments
Article is closed for comments.