我正在使用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 '') ...
据我所知,我正在将一个非整数值放入一个非整数参数中,因此它应该起作用,但是由于某种原因,它认为该值是一个整数?
是什么原因造成的?
解决方法:
您甚至在进入function type resolution之前,输入都会失败,并在ARRAY constructor中出现语法错误-删除所有根本不应该包含在调用中的ARRAY构造函数后,由于其他类型不匹配,您将收到更多错误消息.
您的解决方案是传递匹配类型的单独参数,而不是数组.剩下的只是对我们所见内容的解释.
到底发生了什么
数组只能包含相同类型的值,但是您的输入将numeric constants与非数字string literal混合,无法解析.
如果希望它解析为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”.您的旅程结束于:
- Convert all inputs to the selected type. Fail if there is not a conversion from a given input to the selected type.
由于字符串文字’WwLEA6XZ0V’无法转换为整数.