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