Identificador não declarado(PLS00201)

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
luciano.aol
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Ter, 12 Mar 2013 11:57 am

Prezados(as)

Estou criando uma procedure e está dando o erro PLS00201 mas não consigo encontrar o que está faltando. Oracle 11g.

Selecionar tudo

CREATE OR REPLACE PROCEDURE INTRANET.FUNC_INTRANET_RELOAD
IS
    v_unid_mat		funcionarios_geral_intranet.unid_mat%TYPE;
    v_nome	        funcionarios_geral_intranet.nome%TYPE;
    v_nasc		funcionarios_geral_intranet.nasc%TYPE;
    v_cidade		funcionarios_geral_intranet.cidade%TYPE;
    v_cod_funcao	funcionarios_geral_intranet.cod_funcao%TYPE;
    v_desc_func		funcionarios_geral_intranet.desc_func%TYPE;
    v_cod_ccusto	funcionarios_geral_intranet.cod_ccusto%TYPE;
    v_desc_cc		funcionarios_geral_intranet.desc_cc%TYPE;
    v_cpf		funcionarios_geral_intranet.cpf%TYPE;
    v_email		funcionarios_geral_intranet.email%TYPE;
    v_apelido		funcionarios_geral_intranet.apelido%TYPE;
    v_foto		funcionarios_geral_intranet.foto%TYPE;
    v_telefone		funcionarios_geral_intranet.telefone%TYPE;
    v_ramal		funcionarios_geral_intranet.ramal%TYPE;
    v_localtrab		funcionarios_geral_intranet.localtrab%TYPE;
    v_arquivo_ler       utl_file.file_type;
    v_linha 		varchar2(1000);
       
BEGIN
	select unid_mat, nome, nasc, cidade, cod_funcao, desc_func,
	         cod_ccusto, desc_cc, cpf, email, apelido, foto,telefone
	    	 ramal, localtrab
	 into v_unid_mat, v_nome, v_nasc, v_cidade, v_cod_funcao, v_desc_func,
	    	 v_cod_ccusto, v_desc_cc, v_cpf, v_email, v_apelido, v_foto, v_telefone,
	    	 v_ramal, v_localtrab, v_arquivo_ler, v_linha
    from funcionarios_geral_intranet;
	v_arquivo_ler:= UTL_FILE.FOPEN('INTRANET_LOAD', 'carga_intranet.txt', 'R', 32767);
	execute immediate 'truncate table funcionarios_geral_intranet';
        LOOP
...
..
...	
	END LOOP;
	utl_file.fclose(v_arquivo_ler);
END;
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Luciano,

Bem vindo ao forum GLUFKE.

Por favor, você teria a mensagem completa que acompanha este erro PLS-00201?

Exemplo:

PLS-00201: identifier 'ROLLUP' must be declared

Se puder passar este complemento do erro, ficaria mais fácil para o pessoal do forum dar algumas sugestões.

Um ponto importante: Notei que você não informou o código entre "LOOP / END LOOP". Se o erro se referir a uma linha dentro deste LOOP, não se esqueça de postar aqui no forum.

Para ajudar os foristas e você na análise do problema, segue uma descrição deste erro segundo a ORACLE:
Oracle Error: PLS-00201
Error Description:
Identifier "string" must be declared

Error Cause:
You tried to reference either an undeclared variable, exception, procedure, or other item, or an item to which no privilege was granted or an item to which privilege was granted only through a role.

Action:
1) Check your spelling and declaration of the referenced name. 2) Verify that the declaration for the referenced item is placed correctly in the block structure. 3) If the referenced item is indeed declared but you don"t have privileges to refer to that item, for security reasons, you will be notified only that the item is not declared. 4) If the referenced item is indeed declared and you believe that you have privileges to refer to that item, check the privileges; if the privileges were granted only via a role, then this is expected and documented behavior. Stored objects (packages, procedures, functions, triggers, views) run in the security domain of the object owner with no roles enabled except PUBLIC. Again, you will be notified only that the item was not declared.
Abraços,

Sergio Coutinho
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Bom dia luciano,
este erro ocorre pois a quantidade de colunas declaradas em sua query difere da quantidade de variáveis de saída.
Falando um pouco sobre a lógica do seu algoritmo. Você quer carregar todos os registros da tabela em um arquivo e após isto limpar a tabela?
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

No seu select há 2 parametros esperando o retorno de campos do select que não foram passados: "v_arquivo_ler, v_linha"
luciano.aol
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Ter, 12 Mar 2013 11:57 am

Prezados Obrigado a todos que se manifestaram sobre o caso.
Eu vi o problema que você mencionou Noctifero, e já corrigi, alias mudei um pouco o código. Vou postar o código inteiro. vocês verão que no LOOP há uma function criada chamada elemento, que não é de minha autoria e sim do Dr_Gori que ele publicou neste tópico(http://glufke.net/oracle/viewtopic.php?t=1653).

O objetivo da procedure é dar um truncate na tabela FUNCIONARIOS_INTRANET_GERAL, e depois dar insert lendo a partir de um arquivo texto para repopula-la.

A estrutura da tabela é a seguinte:

Selecionar tudo

UNID_MAT	        VARCHAR2(10)	Y
NOME		VARCHAR2(80)	Y
NASC		        DATE	        	Y
CIDADE		CHAR(20)	        Y
COD_FUNCAO	CHAR(5)		Y
DESC_FUNC	CHAR(40)	        Y
COD_CCUSTO	CHAR(11)	        Y
DESC_CC		CHAR(40)	        Y
CPF		        CHAR(11)	        Y
EMAIL		CHAR(50)	        Y
APELIDO		CHAR(15)	        Y
FOTO		CHAR(8)		Y
TELEFONE	         CHAR(12)	        Y
RAMAL		CHAR(10)	        Y
LOCALTRAB	CHAR(50)	        Y
O código é o seguinte

Selecionar tudo

CREATE OR REPLACE PROCEDURE FUNC_INTRANET_RELOAD
IS
    v_unid_mat		varchar2(10);
    v_nome	                varchar2(80);
    v_nasc		        date;
    v_cidade		varchar2(20);
    v_cod_funcao	varchar2(5);
    v_desc_func		varchar2(40);
    v_cod_ccusto	        varchar2(11);
    v_desc_cc		varchar2(40);
    v_cpf		        varchar2(11);
    v_email		        varchar2(50);
    v_apelido		varchar2(15);
    v_foto		        varchar2(8);
    v_telefone		varchar2(12);
    v_ramal		        varchar2(10);
    v_localtrab		varchar2(50);
    v_arquivo_ler        utl_file.file_type;
    v_linha 		        varchar2(1000);
       
BEGIN
	v_arquivo_ler:= UTL_FILE.FOPEN('INTRANET_LOAD', 'carga_intranet.txt', 'R', 32767);
	execute immediate 'truncate table intranet.funcionarios_intranet_geral';
	LOOP
		utl_file.get_line(v_arquivo_ler, v_linha);
  		insert into intranet.funcionarios_intranet_geral values
  					(
  			                     CASE WHEN elemento(Linha,'1',';') = '1' THEN '0501' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
  			                          WHEN elemento(Linha,'1',';') = '2' THEN '0101' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
  				                  WHEN elemento(Linha,'1',';') = '3' THEN '0301' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '4' THEN '0401' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '5' THEN '0601' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '6' THEN 'F101' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '7' THEN 'F201' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '8' THEN 'F301' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '9' THEN 'F401' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '10' THEN 'F501' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '11' THEN 'H101' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
						  WHEN elemento(Linha,'1',';') = '12' THEN 'H301' || SUBSTR(LPAD(elemento(Linha,'3',';'),7,'0'),2,6)
					     END, --unidmat
  		       			     elemento(Linha,'4',';'),--Nome
                       			     elemento(Linha,'5',';'),--Data
		       			     SUBSTR(elemento(Linha,'6',';'), 5, LENGTH(elemento(Linha,'6',';')) - 4), --cidade
		       			     elemento(Linha,'7',';'),--codigo da funcao  
		       			     elemento(Linha,'8',';'),--descr funcao  
		       			     elemento(Linha,'9',';'),--centro de custos  
		        		     elemento(Linha,'10',';'),--descr custos
		       			     elemento(Linha,'11',';'),--cpf  
		       			     elemento(Linha,'12',';'),--email  
		       			     elemento(Linha,'13',';'),--apelido  
		       			     '', --foto
		       			     '', --telefone
		       			     '', --ramal
		       			     elemento(Linha,'14',';') 
		                        );
	END LOOP;
	utl_file.fclose(v_arquivo_ler);
END;
Erro dado ao compilar a procedure pelo SQL*PLUS é o seguinte:

Selecionar tudo

Warning: Procedure created with compilation errors
SQL> SHOW ERRORS;
Errors for PROCEDURE SIGA.FUNC_INTRANET_RELOAD:

LINE/COL ERROR
-------- ------------------------------------------
54/27    PL/SQL: ORA-00984: column not allowed here
26/5     PL/SQL: SQL Statement ignored
Desculpem o tamanho do post, mas para explicar detalhadamente o assunto não tinha outro jeito. Utilizo Oracle 10g Enterprise Edition Release 10.2.0.4.0
luciano.aol
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Ter, 12 Mar 2013 11:57 am

Pessoal,

Enfim achei o erro. Desatenção total.

Na linha em que faço a leitura do arquivo texto está da seguinte forma

Selecionar tudo

utl_file.get_line(v_arquivo_ler, v_linha);
No insert into na cláusula values estou colocando da seguinte forma:

Selecionar tudo

elemento(Linha,'14',';') 
Quando o correto é

Selecionar tudo

elemento(v_linha,'14',';') 
A variável correta é o v_linha que foi declarado e não o linha.

At.
Luciano
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes