Eu tinha posto '2006'::text porque executando um explain com a consulta vi
que havia uma comparação entre um double e um text. Por falta de atenção e
não ter me atentado no manual, conclui rapidamente que o double era o
'2006', quando era o ano em date_part. Na verdade me pareceu mais lógico, já
que date_part('year ..) seria um valor conhecido : ou texto, ou smallint ou
int, nunca um double (porque um double para ano?). Então, para confirmar:
qualquer coisa entre plics é sempre um texto?
O que é mais rápido, a comparação entre textos ou entre doubles?Att., Sergio 2009/7/26 Tiago Adami <[email protected]> > 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 > >
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
