не может быть преобразован в

ользую 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?

Что вызвало бы это?

 Prem22 дек. 2017 г., 19:43
Можете ли вы попробовать указать длину varchar. Я читал, что если вы не укажете, он установлен на длину символов по умолчанию.
 MattR22 дек. 2017 г., 19:36
другие записи проходят, кроме этой? и что происходит, когда тип данныхtext вместоvarchar?
 Andrew Alexander22 дек. 2017 г., 19:38
Нет, это первая запись, так что, вероятно, все они терпят неудачу
 Daniel Roseman22 дек. 2017 г., 19:42
Пожалуйста, покажите остальную часть кода. Какprepared_func а такжеprepared_values определено в Python?
 Andrew Alexander22 дек. 2017 г., 19:45
prepare_func - это строка, а prepare_values ​​- это список. Я буду публиковать фактические данные немного позже, вдали от компьютера

Ответы на вопрос(1)

ARRAY конструктор еще до того, какразрешение типа функции - где вы получите больше сообщений об ошибках из-за других несовпадений типов после удаления конструктора ARRAY, который вообще не должен быть в вызове.

Ваше решение пройтиотдельные параметры соответствующего типа, не массив. Остальное - просто объяснение того, что мы видели.

Что на самом деле произошло

Массив может включать в себя только значения одного типа, но ваши входные миксычисловые константы с нечисловымстроковый литерал, который не может быть решен.

Если вы хотите, чтобы решить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'] незаконно и по праву так.

Точные правила разрешения типов для конструкторов массивов можно найти в этой главе руководства:«Преобразование типов» - «UNION, CASE и связанные с ними конструкции», Ваше путешествие заканчивается в:

Конвертировать все входы в выбранный тип. Ошибка, если нет преобразования из данного входа в выбранный тип.

Поскольку строковый литерал'WwLEA6XZ0V' не может быть преобразован вinteger.

Ваш ответ на вопрос