Friday, 5 August 2016

ORA-04042: procedure, function, package, or package body does not exist

BUG:
I have encountered below ORA-04042 exception while doing pl/sql coding.



ERROR at line 1:
ORA-04042: procedure, function, package, or package body does not exist
ORA-06512: at "SYS.DBMS_JAVA_XXX", line 33
ORA-06512: at line 1

When encountered this exception I googled on resolution but couldn't found any help to what I exactly working on. As my code is bit complex I have to spent so many hours debugging the issue and finally managed to resolve the issue. Sharing the fix so that it may helps someone someday.

Fix: (explained with suedo example)

stored procedure: p1
package: a1 
package body: ab1


a1  package definition (contains definitions of stored procedures, functions etc etc)
p1 defined inside a1
ab1 contains actual procedure body of p1

I was trying to execute p1 but failing with above error. After debugging found that p1 is trying to grant privileges to oracle db object  "DBMS_JAVA" of object type package but failing due to package DBMS_JAVA does not exist in my db ( in my case it's DBMS_JAVA, it may be something else object and type in your case ). 

I debugged code by adding dbms output statements because my code creates a collection of db objects
dynamically run-time and grants privileges.

Below  is the exact line of code where above stated error occured.
grant execute on sys.DBMS_JAVA to "SYS"

Since I found out what object is failing (DBMS_JAVA). I checked the status of this object in database using below select query. Row highlighted in red below was missing which means for object_name DBMS_JAVA object_type "Package Body" exist where as object_type "Package" is missing. So my database is somewhat in corrupt state I got it fixed which solved the actual problem.

Showing the output of select query after fixing the issue for your understanding purposes. Before fixing, below query resulted in 2 rows, row highlighted in red below doesn't exist.
SQL> select object_name, object_type, status from dba_objects where object_name = 'DBMS_JAVA';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
DBMS_JAVA                      PACKAGE             VALID
DBMS_JAVA                      PACKAGE BODY        VALID
DBMS_JAVA                      SYNONYM             VALID

3 rows selected.

Hope  this helps. Please comment if you find it useful. 
 
Thanks!!!!!

3 comments:

  1. You just did not mention what exactly you did to fix the error or how did you fix your corrupted database

    ReplyDelete
  2. You just did not mention what exactly you did to fix the error or how did you fix your corrupted database

    ReplyDelete
  3. haha very well explained..Did not understand anything. :D

    ReplyDelete