Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que recebo PLS-00302:o componente deve ser declarado quando existe?


Você pode obter esse erro se tiver um objeto com o mesmo nome do esquema. Por exemplo:
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 você se refere a S2.MY_FUNC2 o nome do objeto está sendo resolvido para que ele não tente avaliar S2 como um nome de esquema. Quando você apenas chama como MY_FUNC2 não há confusão, então funciona.

A documentação explica a resolução de nomes. A primeira parte do nome do objeto qualificado - S2 aqui - é avaliada como um objeto no esquema atual antes de ser avaliada como um esquema diferente.

Pode não ser uma sequência; outros objetos podem causar o mesmo erro. Você pode verificar a existência de objetos com o mesmo nome consultando o dicionário de dados.
select owner, object_type, object_name
from all_objects
where object_name = 'S2';