我正在使用Python和psycopg2。
我试图用一个值列表执行一个准备好的语句:
cur.callproc(prepared_func, prepared_values)
psycopg2.DataError: invalid input syntax for integer: "WwLEA6XZ0V"
LINE 1: ... fn_approve_external_lead(ARRAY[1004, 2, 1079412, 'WwLEA6XZ0...
Postgres中的功能如下:
CREATE OR REPLACE FUNCTION fn_approve_external_lead(
internal_usrid bigint
, ofr_src_id bigint
, ofr_ext_id varchar
, puuid varchar
, paid varchar
, p_note varchar DEFAULT '') ...
所以,据我所知,我将一个非int值放入非int参数,所以它应该工作,但由于某种原因,它认为这个值是一个int?
什么会导致这个?
在你进入ARRAY constructor之前,你的输入在function type resolution中出现语法错误而失败 - 一旦你删除了根本不应该在调用中的ARRAY构造函数,你将会因为其他类型不匹配而得到更多错误消息。
您的解决方案是传递匹配类型的单独参数,而不是数组。其余的只是解释我们所看到的。
数组只能包含相同类型的值,但您的输入混合了numeric constants和非数字string literal,无法解析。
如果你想要它解析为text[]
(text
数组),你必须像这样提供字符串文字:
SELECT ARRAY['1004', '2', '1079412', 'WwLEA6XZ0'];
或直接数组文字,如下:
SELECT '{1004, 2, 1079412, WwLEA6XZ0}'::text[];
但是一旦启动了带有数字常量的ARRAY构造函数,只有数字类型才合法添加。或至少包含可以强制转换为相同类型的内容的字符串文字。你可以:
SELECT ARRAY[1004, 2, 1079412, '1'];
...导致int[]
。要么:
SELECT ARRAY[1004, 2, 1079412, 1.0];
甚至:
SELECT ARRAY[1004, 2, 1079412.0, '1.0'];
......两者都导致了numeric[]
。
但
ARRAY[1004, 2, 1079412, 'WwLEA6XZ0V']
是非法的,理所当然的。
数组构造函数的类型解析的确切规则可以在本手册的这一章中找到:"Type Conversion" - "UNION, CASE, and Related Constructs"。你的旅程结束于:
- 将所有输入转换为所选类型。如果没有从给定输入到所选类型的转换,则失败。
由于字符串文字'WwLEA6XZ0V'无法转换为integer
。