PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Erro de sintaxe do PostgreSQL na consulta parametrizada na data $1

Declarações preparadas


A explicação para isso pode ser encontrada no capítulo Constantes de outros tipos do manual :

Minha ênfase em negrito.

Parâmetros para instruções preparadas não são, na verdade, sting literais mas digitou valores , então você não pode usar o formulário type 'string' . Use uma das outras duas formas para converter o valor em um tipo diferente, como você já encontrou.

Exemplo:
PREPARE foo AS SELECT $1::date;

EXECUTE foo('2005-1-1');

Semelhante para PQexecParams na biblioteca libpq C


A documentação:

A alternativa , conforme mencionado na citação acima, é passar os OIDs dos respectivos tipos de dados com paramTypes[] - se você realmente precisa do elenco. Na maioria dos casos, deve funcionar bem deixar o Postgres derivar tipos de dados do contexto da consulta.

Você pode obter o OID dos tipos de dados no catálogo do sistema pg_type :
SELECT oid FROM pg_type WHERE typname = 'date';

Você deve usar o nome de tipo interno correto. Por exemplo:int4 para integer .
Ou com uma conversão de conveniência para regtype :
SELECT 'date'::regtype::oid;

Isso é mais flexível, pois também são aceitos aliases conhecidos para o nome do tipo. Por exemplo:int4 , int ou integer para integer .