Cursor - pre insert

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

Bom dia,

Estou tentando fazer uma validação para que não sejam inseridos registros iguais e no pre-insert fiz o código abaixo, porém quando vou inserir um registro já existente, ao invés de dar a mensagem do código, ocorre o erro, de cursor inváido.

ORA-01001 invalid cursor

Cause Either a host language program call specified an invalid cursor or the values of the AREASIZE and MAXOPENCURSORS options in the precompiler command were too small. All cursors must be opened using the OOPEN call before being referenced in any of the following calls: SQL, DESCRIBE, NAME, DEFINE, BIND, EXEC, FETCH, and CLOSE. The Logon Data Area (LDA) must be defined by using OLON or OLOGON. If the LDA is not defined, this message is issued for the following calls: OPEN, COM, CON, ROL, and LOGOFF.

Action Check the erroneous call statement. Specify a correct LDA area or open the cursor as required. If there is no problem with the cursor, it may be necessary to increase the AREASIZE and MAXOPENCURSORS options before precompiling.

Código:

Selecionar tudo

Declare
 
 Cursor cInserir is (Select cd_bd
                           ,desc_bd
                       From create_banco_de_dados);
        rInserir cInserir%rowtype;        
        
Begin
 
 Open cInserir;
  Loop
   Fetch cInserir into rInserir;
   Exit when cInserir%notfound;
    
    If    (:create_banco_de_dados.cd_bd   = rInserir.cd_bd)
     and (:create_banco_de_dados.desc_bd = rInserir.desc_bd) Then     
     message ('Atenção: Banco de dados, já cadastrado.');
      raise form_trigger_failure;     
    End If;
    
   Close cInserir;
  End Loop;
End;
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, uma dica:

Retire o CLOSE <NOMECURSOR> de dentro do teu loop.
Coloque-o depois do END LOOP.

Selecionar tudo

Declare 
  
 Cursor cInserir is (Select cd_bd 
                           ,desc_bd 
                       From create_banco_de_dados); 
        rInserir cInserir%rowtype;        
        
Begin 
  
 Open cInserir; 
  Loop 
   Fetch cInserir into rInserir; 
   Exit when cInserir%notfound; 
    
    If    (:create_banco_de_dados.cd_bd   = rInserir.cd_bd) 
     and (:create_banco_de_dados.desc_bd = rInserir.desc_bd) Then      
     message ('Atenção: Banco de dados, já cadastrado.'); 
      raise form_trigger_failure;      
    End If; 
    
  End Loop; 
   Close cInserir; 

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

Deu certo, ele dá o erro de PK, mas não exibe a mensagem.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, duplica teu message.
Provavelmente ele apareceu no rodapé e você não viu.

Selecionar tudo

Declare 
  
 Cursor cInserir is (Select cd_bd 
                           ,desc_bd 
                       From create_banco_de_dados); 
        rInserir cInserir%rowtype;        
        
Begin 
  
 Open cInserir; 
  Loop 
   Fetch cInserir into rInserir; 
   Exit when cInserir%notfound; 
    
    If    (:create_banco_de_dados.cd_bd   = rInserir.cd_bd) 
     and (:create_banco_de_dados.desc_bd = rInserir.desc_bd) 
   Then      
       message ('Atenção: Banco de dados, já cadastrado.'); 
       message ('Atenção: Banco de dados, já cadastrado.'); 

      raise form_trigger_failure;      
    End If; 
    
  End Loop; 
   Close cInserir; 

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

Não aparece, dá erro de PK no rodapé.

Antes criei uma validação para confirmar se o registro vai ser inserido, será que tem alguma relação ?

No botão de confirmar está assim

Selecionar tudo

Declare
	nRecebe number;

Begin
	
 If   (:create_banco_de_dados.cd_bd)   is null 
 	or (:create_banco_de_dados.desc_bd) is null Then
 	 
 	 nRecebe:= show_alert('alert_salvar');
 	 raise form_trigger_failure;
 End If;
 	
 nRecebe := show_alert('alert_confirmar_bd');
 
 If (nRecebe = ALERT_BUTTON1) then
 	 commit; 	 
 End If;

End;
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Eu acho que dá o erro de Pre-Insert, pois ele está ocorrendo antes da tua validação.

Coloca essa validação, ao clicar do botão que você tem e, faz um teste.

Se já existir, nem passa pelo Pre-insert e já mostra o erro, beleza?
ORA-PLSQL
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Sáb, 16 Fev 2008 5:22 pm
Localização: Paulista-PE

Mas a validação está no botão de confirmar.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Se já está no botão de confirmar, tudo leva à crer que, tua tabela de comparação, ou está vazia ou, não contém os dados válidos na comparação.

Ele não está entrando neste IF aqui:

Selecionar tudo

 If    (:create_banco_de_dados.cd_bd   = rInserir.cd_bd) 
     and (:create_banco_de_dados.desc_bd = rInserir.desc_bd) 
   Then ...     
Faça um teste, fora deste IF (pode ser antes dele), coloque dois messages e, veja se ele é apresentado na tela pra você.

Exemplo:

Selecionar tudo

Declare 
  
 Cursor cInserir is (Select cd_bd 
                           ,desc_bd 
                       From create_banco_de_dados); 
        rInserir cInserir%rowtype;        
        
Begin 
 message('Antes');
 message('Antes'); 
 Open cInserir; 
  Loop 
   Fetch cInserir into rInserir; 
   Exit when cInserir%notfound; 
    
    If    (:create_banco_de_dados.cd_bd   = rInserir.cd_bd) 
     and (:create_banco_de_dados.desc_bd = rInserir.desc_bd) 
   Then      
       message ('Atenção: Banco de dados, já cadastrado.'); 
       message ('Atenção: Banco de dados, já cadastrado.'); 

      raise form_trigger_failure;      
    End If; 
    
  End Loop; 
   Close cInserir; 
 message('Depois');
 message('Depois');

End; 
Ele irá te apresentar estas mensagens de Debug.
Daí, aproveita e dá uma analisada nas comparações, beleza?
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, agora está funcionando certinho. :D
Responder
  • Informação
  • Quem está online

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