Erro procedure

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
ORA-PLSQL
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Sáb, 16 Fev 2008 5:22 pm
Localização: Paulista-PE

Boa tarde, estou fazendo uma procedure, para verificar se estão sendo inseridos registros iguais, porém está dado o erro: subprogram ou cursor cComponente reference is out fo scope.

Segue abaixo o código:

Selecionar tudo

Procedure Verifica_Componente is

	 Cursor cComponente is Select descricao  
                               ,unidade     
                               ,tipo         
                               ,custo_prod   
                               ,custo_improd 
                               ,capacidade   
                               ,dt_coleta    
                           From Componentes;
          rComponente cComponente%rowtype;
                           
Begin
  
  Open cComponente;
  Loop
   Fetch cComponente into rComponente;
   Exit when cComponente%notfound;
  Close cComponente;
 
  If   (cComponente.descricao     = rComponente.descricao)
   And (cComponente.unidade       = rComponente.unidade)
   And (cComponente.tipo          = rComponente.tipo)
   And (cComponente.custo_prod    = rComponente.custo_prod)
   And (cComponente.custo_improd  = rComponente.custo_improd)
   And (cComponente.capacidade    = rComponente.capacidade)
   And (cComponente.dt_coleta     = rComponente.dt_coleta)Then
   
   message('Componente já cadastrado');
   raise form_trigger_failure;
  
  Else 
  	Commit; 
  		
  End if; 
 End loop;
End;
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

cara, não está errado isso aí não?!

você abre um Cursor (cComponente) com o Select, aí atribui ele a variável rComponente, aí você compara o cursor com a variável, tipo, você está comparando ele com ele mesmo, está errado isso aí


você pode fazer isso sem usar Cursor, imagino que você tenha esses valores na tela (Forms) para comparar, se eu entendi certo sua dúvida, eu faria assim:

Selecionar tudo

PROCEDURE Verifica_Componente IS                          

  qtd_registros NUMBER := 0;
 
BEGIN
 
  SELECT COUNT(*)
    INTO qtd_registros
    FROM Componentes
   WHERE descricao    = :bloco.descricao    --campo do Forms
     AND unidade      = :bloco.unidade      --campo do Forms
     AND tipo         = :bloco.tipo         --campo do Forms
     AND custo_prod   = :bloco.custo_prod   --campo do Forms
     AND custo_improd = :bloco.custo_improd --campo do Forms
     AND capacidade   = :bloco.capacidade   --campo do Forms
     AND dt_coleta    = :bloco.dt_coleta;   --campo do Forms  
  
  IF qtd_registros > 0 THEN
   
    message('Componente já cadastrado');
    RAISE form_trigger_failure;
 
  ELSE
    
    -- Implementa aqui o que você quer que faça 
    -- caso não encontre o registro igual
        
  END IF;
   
END;
ORA-PLSQL
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Sáb, 16 Fev 2008 5:22 pm
Localização: Paulista-PE

Obrigada, fiz de outra forma e deu certinho.
Responder
  • Informação
  • Quem está online

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