Eu tenho um servidor de banco de dados dedicado com Debian Jessie e Postgresql 9.4
Cliente: A é um aplicativo Tomcat Java que usa torque com um driver JDBC conectado ao servidor de banco de dados.
Problema: ao atualizar uma linha com um novo valor, a atualização falha porque o aplicativo transfere o tipo de dados errado.
Mensagem de erro:
a coluna "device_macaddr" é do tipo macaddr, mas a expressão é do tipo caractere variando no caractere 159
Declaração de atualização gerada pelo Torque:
UPDATE device SET device_last_change = $1, device_macaddr = $2 WHERE device_ID = $3
Definição de tipos de dados no postgresql:
last_change is timestamp (0) without time zone NOT NULL
device_macaddr is macaddr NOT NULL
device_id is bigint NOT NULL
Recentemente, atualizamos o driver do banco de dados e do jdbc de 8.4 para 9.4
Consegui identificar a mudança no driver jdbc, mas não consegui encontrar o changelog que mostrava exatamente essa mudança de comportamento.
Desde então, a declaração acima parece não funcionar mais, enquanto funcionava anteriormente, apesar de ser possível o tipo de dados errado naquela época também.
Existe uma maneira de "diminuir" a detecção estrita do servidor de banco de dados Postgres 9.4 para esse caso específico?
Eu li o aprimoramento do driver jdbc para incluir esses tipos de dados adicionais, no entanto, isso ainda não funcionou para mim, então tento obter uma solução alternativa na outra extremidade das opções que tenho.
Roubado descaradamente da resposta de Craig sobre SO .
Você precisa criar um elenco para fazer a
varchar
->macaddr
coerção funcionar automaticamente. É um pouco complicado, pois não há função que faça exatamente isso, então temos que envolver uma função interna em algo que possamos usar:Existe uma maneira mais fácil de fazer isso que não envolve a criação de uma função usando
WITH INOUT
Por padrão o PostgreSQL considera o valor como varchar. Você deve lançá-lo: