python-非整数错误“错误的整数输入语法”?

我正在使用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”.您的旅程结束于:

  1. Convert all inputs to the selected type. Fail if there is not a conversion from a given input to the selected type.

由于字符串文字’WwLEA6XZ0V’无法转换为整数.

上一篇:MySQL char vs.int


下一篇:PHP类的隐式类型转换?