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
.