准备好的报表 http://www.postgresql.org/docs/current/interactive/sql-prepare.html
对此的解释可以找到在本章中其他类型的常量手册的 http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-GENERIC:
The ::
, CAST()
,并且函数调用语法也可用于指定
任意表达式的运行时类型转换,如中讨论的第 4.2.9 节 http://www.postgresql.org/docs/current/interactive/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS. 为了避免语法歧义,type 'string'
句法
只能用于指定简单文字常量的类型。类型的另一个限制'string' syntax
是它不
适用于数组类型;使用::
or CAST()
指定数组的类型
持续的。
大胆强调我的。
准备好的语句的参数实际上并不是刺字文字但输入了values,所以你不能使用这种形式type 'string'
。使用其他两种形式之一将值转换为不同的类型,就像您已经发现的那样。
Example:
PREPARE foo AS SELECT $1::date;
EXECUTE foo('2005-1-1');
类似的PQexecParams在 libpq C 库中 http://www.postgresql.org/docs/current/static/libpq-exec.html
文档:
...在 SQL 命令文本中,将显式强制转换附加到参数
符号显示您将发送的数据类型。例如:
SELECT * FROM mytable WHERE x = $1::bigint;
这个力参数$1
被视为bigint
,而默认情况下
它会被分配与 x 相同的类型。强制参数类型
通过这种方式或通过指定数字类型 OID 的决定是
强力推荐。 ...
The 选择正如上面引用中提到的,是将各个数据类型的 OID 传递给paramTypes[]
- 如果你真的需要演员阵容。在大多数情况下,让 Postgres 从查询上下文中派生数据类型应该可以正常工作。
paramTypes[]
通过 OID 指定要分配给参数的数据类型
符号。如果paramTypes
is NULL
,或数组中的任何特定元素
为零,服务器推断参数符号的数据类型
与处理非类型文字字符串的方式相同。
可以从系统目录中获取数据类型的OIDpg_type http://www.postgresql.org/docs/current/interactive/catalog-pg-type.html:
SELECT oid FROM pg_type WHERE typname = 'date';
您必须使用正确的内部类型名称。例如:int4
for integer
.
或者方便地转换为regtype http://www.postgresql.org/docs/current/interactive/datatype-oid.html#DATATYPE-OID-TABLE:
SELECT 'date'::regtype::oid;
这更加灵活,因为类型名称的已知别名也被接受。例如:int4
, int
or integer
for integer
.