Olá, Roberto.

A partir da versão 8.3 do PostgreSQL, não existe mais CAST automático. Não
entendi direito se esta mudança foi para deixá-lo mais parecido com o Oracle
ou para deixá-lo mais adequado ao SQL ANSI. Acredito que a maioria já
percebeu isso - ou seja, não vai ser "bem assim" migrar bases de dados
existentes de versões anteriores para a 8.3.

De uma forma ou de outra, esta mudança veio para mostrar a mim e a muitos
programadores em SQL e Pl/PgSQL os seus erros. O certo seria existir estes
Casts desde o início, infelizmente.


-- 
Tiago Adami
Paraná - Brasil


2009/7/25 sergio nogueira <[email protected]>

> Roberto,
> era burrice minha mesmo. A função controla a inserção de dados numa tabela
> particionada por ano (2007 a 2010) e eu estava tentando inserir dados de
> 2006 (a tabela não existia, claro). Então nenhuma instrução chegava a ser
> formada, na função. Logo, nada havia a ser exibido. Quando a função era
> chamado nos inserts, com dados de 2006, ia direto para o RAISE EXCEPTION e
> exibia a MINHA MENSAGEM, que não esclarecia nada. Corrigi a minha mensagem
> de erro.
> Um outro problema (outra burrice) que tive foi ao restaurar um dump de um
> PstgreSQL 8.2 para um 8.4 (meu notebook, para testes).
>
> A função testa com
>   IF ( date_part('year', NEW.data::timestamp) = '2006'::text ) THEN
>   ...
>   ELSEIF ...
>  ...
>  ELSE RAISE EXCEPTION ....
>
> Funciona no 8.2 e eu achava que estava ajudando o analisador com os casts.
> Resultado no 8.4:
>
>   ERRO:  operador n�o existe: double precision = text no caracter 46
>   DICA:  Nenhum operador corresponde com o nome e o(s) tipo(s) de
> argumento(s) informados. Voc� precisa adicionar
>   convers�es de tipo expl�citas.
>   --
>   ERRO:  operador n�o existe: double precision = text
>   LINHA 1: SELECT  ( date_part('year',  $1 ::timestamp) = '2006'::text ...
>
> Alterei para
>   IF ( date_part('year', NEW.data::timestamp)::text = '2006'::text ) THEN
> e agora funciona no 8.4
>
> Você sugeriria algo melhor, para estes casts?
>
> Att.,
> Sergio
>
>
> 2009/7/13 Roberto Mello <[email protected]>
>
>> 2009/7/12 sergio nogueira <[email protected]>
>>
>>> Sr(a)s,
>>> como faço para que numa função, raise notice exiba o comando sql que
>>> disparou o aviso?
>>>
>>
>> A função usa PL/pgSQL, não SQL. Como você tem controle da função, por que
>> não colocar o aviso antes dos seu RAISE NOTICE?
>>
>> Ou eu não estou entendendo o que você está tentando fazer.
>>
>> Roberto
>>
>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a