¿Error de “syntax de entrada no válida para un entero” para un no entero?

Estoy usando Python y psycopg2.

Estoy intentando ejecutar una statement preparada con una lista de valores como tal:

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... 

La función en Postgres tiene el siguiente aspecto:

 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 '') ... 

Entonces, por lo que puedo decir, estoy poniendo un valor no int en un argumento no int, por lo que debería funcionar, pero por alguna razón piensa que este valor es un int?

¿Qué causaría esto?

Su entrada falla con un error de syntax en el constructor ARRAY incluso antes de llegar a la resolución de tipo de función , donde recibirá más mensajes de error debido a otras discrepancias de tipo una vez que elimine el constructor ARRAY que no debería estar en la llamada.

Su solución es pasar parámetros separados de tipo coincidente , no una matriz. El rest es solo una explicación de lo que vimos.

Lo que realmente sucedió

Una matriz solo puede incluir valores del mismo tipo, pero su entrada mezcla constantes numéricas con un literal de cadena no numérica, que no se puede resolver.

Si desea que se resuelva en text[] (matriz de text ), debe proporcionar literales de cadena como:

 SELECT ARRAY['1004', '2', '1079412', 'WwLEA6XZ0']; 

O una matriz literal directamente, así:

 SELECT '{1004, 2, 1079412, WwLEA6XZ0}'::text[]; 

Pero una vez que inicie un constructor ARRAY con constantes numéricas, solo se pueden agregar tipos numéricos. O, al menos, literales de cadena con contenido que puede ser forzado al mismo tipo. Usted podría :

 SELECT ARRAY[1004, 2, 1079412, '1']; 

… resultando en int[] . O:

 SELECT ARRAY[1004, 2, 1079412, 1.0]; 

O incluso:

 SELECT ARRAY[1004, 2, 1079412.0, '1.0']; 

… ambos resultando en numeric[] .

Pero ARRAY[1004, 2, 1079412, 'WwLEA6XZ0V'] es ilegal y con razón.

Las reglas exactas de la resolución de tipos para constructores de matrices se pueden encontrar en este capítulo del manual: “Conversión de tipos” – “UNION, CASO y construcciones relacionadas” . Tu viaje termina en:

  1. Convertir todas las entradas al tipo seleccionado. Falla si no hay una conversión de una entrada dada al tipo seleccionado.

Dado que la cadena literal ‘WwLEA6XZ0V’ no se puede convertir en integer .