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 .