我正在使用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?
导致这种情况的原因是什么?
答案 0 :(得分:2)
在你进入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
。