Skip to content

ORA-04043 Object Does Not Exist - Resolution Guide

Error Text: ORA-04043: object string does not exist

This error occurs when you reference a database object (table, view, procedure, package, synonym, sequence, etc.) that Oracle cannot find. Unlike ORA-00942 (which is specific to tables/views in DML), ORA-04043 applies to any database object and is commonly seen in DDL operations, DESCRIBE commands, GRANT statements, and PL/SQL compilation.

  • Typo in object name
  • Object was dropped or never created
  • Wrong database or PDB
  • Object exists in a different schema
  • Missing schema prefix
  • Current user’s default schema doesn’t own the object
  • Object created with quoted identifiers (case-sensitive)
  • Referring to “MyTable” without quotes
  • Public or private synonym is missing
  • Synonym points to a dropped object
  • Synonym chain is broken
  • Object exists but user has no privileges on it
  • In some DDL contexts, Oracle reports ORA-04043 instead of ORA-01031
-- Find objects matching the name (case-insensitive search)
SELECT owner, object_name, object_type, status, created
FROM dba_objects
WHERE object_name LIKE UPPER('%YOUR_OBJECT_NAME%')
ORDER BY owner, object_type;
-- Exact name match
SELECT owner, object_name, object_type, status
FROM dba_objects
WHERE object_name = UPPER('YOUR_OBJECT_NAME');
-- Check for case-sensitive names (created with double quotes)
SELECT owner, object_name, object_type
FROM dba_objects
WHERE object_name = 'YourExactCaseName';
-- Check for synonyms pointing to the object
SELECT owner, synonym_name, table_owner, table_name, db_link
FROM dba_synonyms
WHERE synonym_name = UPPER('YOUR_OBJECT_NAME');
-- Check if a synonym's target exists
SELECT s.owner as synonym_owner, s.synonym_name,
s.table_owner, s.table_name,
CASE WHEN o.object_name IS NOT NULL THEN 'EXISTS' ELSE 'MISSING' END as target_status
FROM dba_synonyms s
LEFT JOIN dba_objects o ON s.table_owner = o.owner AND s.table_name = o.object_name
WHERE s.synonym_name = UPPER('YOUR_OBJECT_NAME');
-- What schema am I currently in?
SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') as current_schema,
SYS_CONTEXT('USERENV', 'SESSION_USER') as session_user,
SYS_CONTEXT('USERENV', 'CON_NAME') as container
FROM dual;
-- What objects do I own with this name?
SELECT object_name, object_type, status
FROM user_objects
WHERE object_name = UPPER('YOUR_OBJECT_NAME');
-- Object might have been dropped but is still in the recycle bin
SELECT object_name, original_name, type, droptime
FROM dba_recyclebin
WHERE original_name = UPPER('YOUR_OBJECT_NAME')
ORDER BY droptime DESC;
-- Are you in the right PDB?
SELECT name, open_mode, con_id FROM v$pdbs;
-- Check if object exists in another PDB
-- (Must be connected as common user in CDB$ROOT)
SELECT con_id, owner, object_name, object_type
FROM cdb_objects
WHERE object_name = UPPER('YOUR_OBJECT_NAME');
-- Instead of:
DESCRIBE my_table;
-- ORA-04043: object MY_TABLE does not exist
-- Use fully qualified name:
DESCRIBE hr.my_table;
-- Or set current schema:
ALTER SESSION SET CURRENT_SCHEMA = HR;
DESCRIBE my_table;
-- Create a private synonym for your user
CREATE SYNONYM my_table FOR hr.my_table;
-- Or create a public synonym (requires CREATE PUBLIC SYNONYM)
CREATE PUBLIC SYNONYM my_table FOR hr.my_table;

Solution 3: Fix Case-Sensitive Object Names

Section titled “Solution 3: Fix Case-Sensitive Object Names”
-- If object was created with quotes:
-- CREATE TABLE "MyTable" (...)
-- You MUST use quotes to reference it
DESCRIBE "MyTable";
SELECT * FROM "MyTable";
-- To avoid this issue, rename to standard uppercase
ALTER TABLE "MyTable" RENAME TO MY_TABLE;
-- If the object was recently dropped
FLASHBACK TABLE my_table TO BEFORE DROP;
-- If there are multiple versions, specify the recycle bin name
FLASHBACK TABLE "BIN$abc123==$0" TO BEFORE DROP RENAME TO my_table;
-- If object exists but user can't see it
GRANT SELECT ON hr.my_table TO your_user;
GRANT EXECUTE ON hr.my_package TO your_user;
-- For DDL operations on another user's objects
GRANT ALTER ON hr.my_table TO your_user;
GRANT DROP ANY TABLE TO your_user; -- Use sparingly
-- If the object truly doesn't exist, create it
-- Check if a creation script exists in version control
-- For packages, recompile if body is missing
ALTER PACKAGE hr.my_package COMPILE;
ALTER PACKAGE hr.my_package COMPILE BODY;
-- ORA-04043 on DESCRIBE
DESC my_package;
-- ORA-04043: object MY_PACKAGE does not exist
-- Check: is it in your schema or another?
SELECT owner, object_name, object_type, status
FROM all_objects
WHERE object_name = 'MY_PACKAGE';
-- If in another schema:
DESC other_schema.my_package;
-- Granting on non-existent object
GRANT SELECT ON old_table TO app_user;
-- ORA-04043: object OLD_TABLE does not exist
-- Verify the object exists in YOUR schema
SELECT object_name FROM user_objects WHERE object_name = 'OLD_TABLE';
-- If it's in another schema, qualify it
GRANT SELECT ON hr.old_table TO app_user;
-- Dropping non-existent object
DROP TABLE my_table;
-- ORA-04043 if table doesn't exist
-- Use IF EXISTS (Oracle 23ai)
DROP TABLE IF EXISTS my_table;
-- Pre-23ai workaround
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE my_table';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN RAISE; END IF;
END;
/
-- Always use owner.object_name in scripts and applications
SELECT * FROM hr.employees;
EXECUTE hr.my_package.my_procedure();
-- Check existence before operating on objects
SELECT COUNT(*) INTO v_exists
FROM user_objects
WHERE object_name = UPPER('MY_TABLE')
AND object_type = 'TABLE';
-- Regularly check for broken synonyms
SELECT s.owner, s.synonym_name, s.table_owner, s.table_name
FROM dba_synonyms s
WHERE NOT EXISTS (
SELECT 1 FROM dba_objects o
WHERE o.owner = s.table_owner AND o.object_name = s.table_name
)
AND s.db_link IS NULL;