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

Responder a