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
