Gravar dados em tabela temporária

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Oi pessoal,

estou precisando de mais um help...

Isso eu nunca fiz, então quem puder me explicar detalhadamente eu agradeço.
Eu criei uma tela com dados não basetable e dados basetable e preciso gravá-los em uma tabela temporária, alguém pode me ajudar, como fazer...

Obrigada,
:)
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Olá Luana, tdo beleza??

segue abaixo um exemplo de como fazer isso.

Selecionar tudo

GO_BLOCK('PARAMETROS');
FIRST_RECORD;
LOOP   
   INSERT INTO PARAMETRO (CODIGO, 
                          DESCRICAO, 
                          VALOR) 
                  VALUES (:PARAMETROS.CODIGO,
                          :PARAMETROS.DESCRICAO,
                          :PARAMETROS.VALOR);
	
   IF :SYSTEM.LAST_RECORD = 'TRUE' THEN
      EXIT;
   ELSE
      NEXT_RECORD;
   END IF;		
END LOOP;	
[]'s
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Tineks tdo bleza,

Eu coloquei seu exemplo na trigger do WHEN-BUTTON-PRESSED de acordo com o nome dos campos e bloco da minha tela, pois assim que eu clico no botão que eu criei, o botão muda de label e faz o insert na minha tabela temporária, mas ao clicar no botão aparece a mensagem de erro abaixo:

FRM-40735: WHEN-BUTTON-PRESSED trigger raised unhandled exception ORA-04098.

O que pode ser? :(

Obrigada,
Luana
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

Luana,

Pra melhorar o codigo, coloque uma EXCEPTION no teu WHEN-BUTTON-PRESSED e manda pra gente.
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Oi Trevisolli,

Olha como está a lógica abaixo:

Selecionar tudo

BEGIN
   IF (:BLK_SELETOR.DT_FROM IS NOT NULL AND :BLK_SELETOR.DT_TO IS NOT NULL)OR
       (:BLK_SELETOR.CATEGORY IS NOT NULL)OR
        (:BLK_SELETOR.ID_UNID_EMP IS NOT NULL)THEN   
         SET_ITEM_PROPERTY('FFOR_FAT_FORNEC.BTN_UNCONFIRMED',LABEL,'CONFIRMED');
         
         GO_BLOCK('FFOR_FAT_FORNEC'); 
         FIRST_RECORD;           
            LOOP
               BEGIN    
                  INSERT INTO INTQ_LOG_TRIGGER_FFOR (TIPO_TRANSACAO,
                                                     ID_INSTALACAO_EMPRESA_PEDIDO,
                                                     ID_UNID_EMP,
                                                     NUM_FAT_FORNEC,
                                                     COD_INTERNO_FAT_FORNEC,                                                   
                                                     DATA_GERACAO_INTQ)                                      
                                             VALUES (0,
                                                     0,
                                                     :FFOR_FAT_FORNEC.ID_UNID_FORNEC,  
                                                     :FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC, 
                                                     0,
                                                     :FFOR_FAT_FORNEC.NUM_FAT_FORNEC);
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN 
                  MESSAGE('TESTE');
              END;
   IF :SYSTEM.LAST_RECORD = 'TRUE' THEN 
      EXIT; 
   ELSE 
      NEXT_RECORD; 
   END IF;        
            END LOOP;
END IF;    
 
 
END;

Eu não sei se está legal, pois eu nunca fiz isso...
Na verdade eu inclui os campos de Primary Key recebendo zero(0), pois acredito que mesmo eu não precise deles é necessário inclui-los ou estou enganada?


Valeu,
Um abraço,
Luana :)
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Oi Luana,

o erro na inclusao pode acontecer caso já exista algum registro na tabela com a PK 0, mas pra facilitar você pode fazer o seguinte, você já criou uma exception abaixo do insert só q nela você colocou um no_data_found, como você está incluindo nunca vai dar um no_data_found, substitua ela pelo others, por exemplo,

Selecionar tudo

         BEGIN
            INSERT ...
         EXCEPTION
            WHEN OTHERS THEN
               MESSAGE ('ERRO NO INSERT : '||SQLERRM);
               MESSAGE ('ERRO NO INSERT : '||SQLERRM);
         END;
depois você pode colocar mais um exception, só q um exception geral, q fica no final da sua trigger, por exemplo..

Selecionar tudo

BEGIN
   IF    (:blk_seletor.dt_from IS NOT NULL AND :blk_seletor.dt_to IS NOT NULL
         )
      OR (:blk_seletor.CATEGORY IS NOT NULL)
      OR (:blk_seletor.id_unid_emp IS NOT NULL) THEN
      .
      .
      .
      .
   END IF;   
EXCEPTION
   WHEN OTHERS THEN
      MESSAGE ('ERRO NO GERAL : '||SQLERRM);
      MESSAGE ('ERRO NO GERAL : '||SQLERRM);
END;
depois disso você roda sua aplicação, e o erro será exibido na tela, ai você posta aqui pra gente o erro q deu..

[]'s
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Oi,

coloquei os exceptions e o erro segue abaixo:

ERRO NO INSERT: ORA-01861: literal does not match format string

Luana :)
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Olá Luana,

provavelmente o erro esteja ocorrendo no campo "dt_emissao_fat_fornec"
faça um teste, substitua no insert o campo

Selecionar tudo

:ffor_fat_fornec.dt_emissao_fat_fornec
por

Selecionar tudo

TO_DATE(:ffor_fat_fornec.dt_emissao_fat_fornec,'DD/MM/YYYY')
tenta ai e depois da um retorno..

[]'s[/b]
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Oi sou eu de novo... Rsrsrs...

Agora aparece a seguinte msg:

ERRO NO INSERT: ORA-01858: a non-numeric character was found where a numeric was expected.

Eu não sei o que pode estar acontecendo, mas acho que tem a ver com os valores que estou incluindo, veja abaixo:

Selecionar tudo

BEGIN
   IF (:BLK_SELETOR.DT_FROM IS NOT NULL AND :BLK_SELETOR.DT_TO IS NOT NULL)OR
       (:BLK_SELETOR.CATEGORY IS NOT NULL)OR
        (:BLK_SELETOR.ID_UNID_EMP IS NOT NULL)THEN   
         SET_ITEM_PROPERTY('FFOR_FAT_FORNEC.BTN_UNCONFIRMED',LABEL,'CONFIRMED');
         
         GO_BLOCK('FFOR_FAT_FORNEC'); 
         FIRST_RECORD;           
            LOOP
               BEGIN    
                  INSERT INTO INTQ_LOG_TRIGGER_FFOR (TIPO_TRANSACAO,
                                                     ID_INSTALACAO_EMPRESA_PEDIDO,
                                                     ID_UNID_EMP,
                                                     NUM_FAT_FORNEC,
                                                     COD_INTERNO_FAT_FORNEC,                                                   
                                                     DATA_GERACAO_INTQ)                                      
                                             VALUES ( 0,
                                                      0,
                                                     :FFOR_FAT_FORNEC.ID_UNID_FORNEC,  
                                                     to_date(:FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC,'mm/dd/yyyy'), 
                                                     '0',
                                                     :FFOR_FAT_FORNEC.NUM_FAT_FORNEC);
               EXCEPTION 
               WHEN OTHERS THEN 
               MESSAGE ('ERRO NO INSERT : '||SQLERRM); 
               MESSAGE ('ERRO NO INSERT : '||SQLERRM);
              END;
   IF :SYSTEM.LAST_RECORD = 'TRUE' THEN 
      EXIT; 
   ELSE 
      NEXT_RECORD; 
   END IF;        
            END LOOP;
END IF;    
 EXCEPTION 
   WHEN OTHERS THEN 
      MESSAGE ('ERRO NO GERAL : '||SQLERRM); 
      MESSAGE ('ERRO NO GERAL : '||SQLERRM); 

 
END;
Luana :)
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

olha a formatacao do to_date invertido verifica se não é isto

Selecionar tudo

to_date(:FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC,'mm/dd/yyyy')
troca por

Selecionar tudo

to_date(:FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC,'dd/mm/yyyy')
dd - significa dois digitos para dia
mm - significa dois digitos para mês
yyyy - significa quatro digitos para ano
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Não porque a data gravada devará ficar no formato americano, porisso fica MM/DD/YYYY, entendeu?

Luana :D
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

bom pelo q eu saiba Luana o banco não consegue salvar neste formato... pelo menos nunca trabalhei desta forma...

tipo ter q tratar essa formatação americana que você quer na mascara do seu campo e não no banco de dados...

mas, caso esteja enganado pelo nome de suas colunas eu acho q tambem podem ser:

DATA_GERACAO_INTQ você insere :FFOR_FAT_FORNEC.NUM_FAT_FORNEC pelo nome da sua coluna parece um campo data

ou

COD_INTERNO_FAT_FORNEC você insere '0' não é um campo numérico??


abrs
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Luana,

se o campo DATA_GERACAO_INTQ for do tipo VARCHAR você pode gravar nesse formato (DD/MM/YYYY), mas se o campo for date você vai ter q passar um campo no formato Date..

[]s
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

Luana, boa tarde.

Analisei o código e, será que você não inverteu os valores no finalzinho do teu insert?

Selecionar tudo

BEGIN    
                  INSERT INTO INTQ_LOG_TRIGGER_FFOR (TIPO_TRANSACAO, 
                                                     ID_INSTALACAO_EMPRESA_PEDIDO, 
                                                     ID_UNID_EMP, 
                                                     NUM_FAT_FORNEC, 
                                                     COD_INTERNO_FAT_FORNEC,                                                    
                                                     DATA_GERACAO_INTQ)                                      
                                             VALUES ( 0, 
                                                      0, 
                                                     :FFOR_FAT_FORNEC.ID_UNID_FORNEC,  
                                                     to_date(:FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC,'mm/dd/yyyy'), 
                                                     '0', 
                                                     :FFOR_FAT_FORNEC.NUM_FAT_FORNEC); 

Faça essa inversão, nas 3 últimas colunas do teu insert e faça um teste:

insert into ....

Selecionar tudo

 NUM_FAT_FORNEC, 
 COD_INTERNO_FAT_FORNEC,                                                    
 DATA_GERACAO_INTQ)   
values

Selecionar tudo

      :FFOR_FAT_FORNEC.NUM_FAT_FORNEC,
       '0', 
             to_date(:FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC,'mm/dd/yyyy');
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

É verdade,
não me atentei ao q o Trevisolli disse, talves nem precise mais desse to_date dentro do insert.

[]'s
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

caso não seja nenhuma destas... manda um desc na sua tabela temporaria


abrçs
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Oi pessoal,

me desculpem a trabalheira, afinal de contas o erro era a minha falta de atenção, pois realmente eu estava incluindo um campo de data em um campo errado... Acho que a gente vai ficando desesperada e acaba perdendo a atenção, isso foi bom que aprendi de verdade...


Só que tem uma dúvida: Eu tenho que incluir o commit logo depois da lógica do insert, correto?

Obrigada pela ajuda de todos!!!

Um abraço,
Luana :D :D :D
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

Então Luana....
Sobre o commit, não sei se seria viável, por se tratar de uma tabela temporária, quer dizer, ficaria uma temporária definitiva, correto?
Verifique e, caso necessário mesmo, coloque depois do teu END LOOP.


Dica importante:

Em alguns casos, TEMP TABLES são criadas com ON COMMIT DELETE ROWS.

Verifique também a criação da tua tabela, pois os dados podem ser "eliminados" quando "Commitados".

Se não tiver parâmetro nenhum na criação da tua tabela (ou tiver um ON COMMIT PRESERVE ROWS), tudo bem, pode colocar o commit.

qualquer coisa, conta com a gente.
Responder
  • Informação
  • Quem está online

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