Oracle
 sql >> Database >  >> RDS >> Oracle

Perché ricevo PLS-00302:il componente deve essere dichiarato quando esiste?

Puoi ottenere quell'errore se hai un oggetto con lo stesso nome dello schema. Ad esempio:

create sequence s2;

begin
  s2.a;
end;
/

ORA-06550: line 2, column 6:
PLS-00302: component 'A' must be declared
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored

Quando fai riferimento a S2.MY_FUNC2 il nome dell'oggetto è in fase di risoluzione, quindi non tenta di valutare S2 come nome di schema. Quando lo chiami semplicemente come MY_FUNC2 non c'è confusione, quindi funziona.

La documentazione spiega la risoluzione dei nomi. La prima parte del nome dell'oggetto completo - S2 qui - viene valutata come un oggetto nello schema corrente prima di essere valutata come uno schema diverso.

Potrebbe non essere una sequenza; altri oggetti possono causare lo stesso errore. Puoi verificare l'esistenza di oggetti con lo stesso nome interrogando il dizionario dei dati.

select owner, object_type, object_name
from all_objects
where object_name = 'S2';