错误"整数"的输入语法无效;对于非整数?

时间:2017-12-22 18:27:14

标签: python postgresql types type-resolution

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

导致这种情况的原因是什么?

1 个答案:

答案 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"。你的旅程结束于:

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

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