bom tarde amigos da lista,
gostaria da ajuda de voces para melhorar a função que fiz com a ajuda do 
histórico da lista e do manual p/ atualizar os registros de uma tabela no 
postgresql 8.3. A idéia é fazer um merge, se encontrar o registro executa 
Update senão Insert.


CREATE OR REPLACE FUNCTION atualizar_tab_171(pArq_path varchar(40), 
pDelimitador char(1)) RETURNS BOOL AS $$ 
DECLARE
    vReg RECORD;
    vLinhas INTEGER DEFAULT 0;
    vSql text;
    vCopy text;
BEGIN
    set datestyle = SQL, DMY;    
    RAISE NOTICE 'Criando tabela temporaria em disco...';    
    CREATE TABLE temp_171(like tab171);

    RAISE NOTICE 'Importando registros p/ tabela temporária ...';
    vCopy:= 'COPY temp_171 FROM '|| quote_literal(pArq_path) ||' WITH DELIMITER 
AS '|| quote_literal(pDelimitador)||' CSV ';
    EXECUTE vCopy;
        
    RAISE NOTICE 'Transferindo registros...';    
    FOR vReg IN SELECT codigo,anomes,ficha_orig,prod_elab FROM temp_171 LOOP
      
      vSql:= 'SELECT codigo,anomes,ficha_orig,prod_elab FROM tab171 '||
             ' WHERE codigo = '||quote_literal(vReg.codigo)||' AND anomes = 
'||quote_literal(vReg.anomes)||
             ' AND ficha_orig = '||quote_literal(vReg.ficha_orig)||' AND 
prod_elab = '||quote_literal(vReg.prod_elab);
                
      EXECUTE(vSql);
      GET DIAGNOSTICS vLinhas = ROW_COUNT; 
      IF vLinhas = 1 THEN
          RAISE NOTICE 'UPDATE...%',vSql;
      ELSIF vLinhas = 0 THEN
          RAISE NOTICE 'INSERT... %',vSql; 
      ELSE
          RAISE EXCEPTION 'ERRO: ENCONTRADO MAIS DE 1 REGISTRO P/ A CHAVE: 
%',vSql;
      END IF;       
        
    END LOOP;                
    set datestyle = SQL, MDY;      
    
    RAISE NOTICE 'Excluindo tabela temporária...';
    EXECUTE('DROP TABLE temp_171');
    RETURN TRUE;
END
$$LANGUAGE plpgsql;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a