对于非整数,错误“整数的输入语法无效”?

问题描述 投票:1回答:1

我正在使用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?

什么会导致这个?

python postgresql types type-resolution
1个回答
2
投票

在你进入ARRAY constructor之前,你的输入在function type resolution中出现语法错误而失败 - 一旦你删除了根本不应该在调用中的ARRAY构造函数,你将会因为其他类型不匹配而得到更多错误消息。

您的解决方案是传递匹配类型的单独参数,而不是数组。其余的只是解释我们所看到的。

What really happened

数组只能包含相同类型的值,但您的输入混合了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"。你的旅程结束于:

  1. 将所有输入转换为所选类型。如果没有从给定输入到所选类型的转换,则失败。

由于字符串文字'WwLEA6XZ0V'无法转换为integer

© www.soinside.com 2019 - 2024. All rights reserved.