On Tue, Aug 27, 2013 at 1:24 PM, Paulo Bastos <[email protected]> wrote:
> Quando estou executando a função abaixo abaixo da msg , está dando erro. > A msg abaixo tirei do log. > > 2013-08-27 13:15:09 BRT ERRO: refer�ncia � coluna "contrato" � amb�gua no > caracter 69 > 2013-08-27 13:15:09 BRT DETALHE: Ela poderia referenciar uma vari�vel > PL/pgSQL ou uma coluna de tabela. > 2013-08-27 13:15:09 BRT CONSULTA: UPDATE socic.contrato SET > numero_contrato = numeradora > WHERE id = contrato > > Função > > CREATE OR REPLACE FUNCTION socic.numeradora_contrato(loja integer, > tipo_vend integer, codigo_fin integer, *contrato* integer) > RETURNS integer AS > $BODY$declare numeradora int4; > > BEGIN > > [...] > > UPDATE socic.numeradora_contrato SET numero_corrente = numeradora > WHERE id_loja = loja > AND tipo_venda = tipo_vend > AND codigo_financeiro = codigo_fin; > UPDATE socic.contrato SET numero_contrato = numeradora > WHERE id = *contrato*; > > RETURN numeradora; > END; > $BODY$ > LANGUAGE plpgsql VOLATILE > COST 100; > > Isso acontece porque o parser do PL/pgSQL não consegue determinar se por "contrato" você está se referindo à variável "contrato" (da função) ou à própria tabela (ou até uma coluna que se chame "contrato", caso exista). > Quando troco contrato (Em negrito na função) por contrato1 funciona. > > Isso porque a ambiguidade desaparece. Uma dica que dou é usar o padrão adotado pelos "Oracreiros" e prefixar os parâmetros com "p_", nesse caso seria "p_contrato" (assim sendo, as variáveis devem ser prefixadas por "v_", etc.). Uma solução (talvez mais elegante) para esse caso é tratar o escopo de forma explícita, colocando o nome da função no UPDATE: UPDATE socic.contrato SET numero_contrato = numeradora WHERE id = *numeradora_contrato.contrato*; E, por fim, mais uma solução, é usar um alias na tabela (eu particularmente prefiro essa, pois a última ainda tem a brecha de uma função com o nome da tabela, nesse caso o PG escolhe a variável, mas fica confuso): UPDATE socic.contrato* c *SET numero_contrato = numeradora WHERE *c.*id = contrato; Antecipadamente agradeço a ajuda > De nada... =D Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
