У меня есть функция:

do
$$
    declare
        cd_id bigint;
        config_detail_ids bigint[];
        partner_script varchar := 'partner_create_cancel_option.groovy';
    begin
        select array (select id from config_detail where code = 'partner') into config_detail_ids;

        update config_detail set create_flag = true, create_script = partner_script,
        cancel_flag = false, cancel_script = partner_script, renew_flag = false, renew_script = null,
        change_status_flag = false, change_status_script = partner_script, label = null,
        deeplink = null, deduplication_flag = true
        where id in (config_detail_ids);

        foreach cd_id in array config_detail_ids loop
            insert into change_status_transition (old_status, new_status, config_detail_id) values
            ('WAIT_CANCEL', 'CANCEL', cd_id),
            ('WAIT_CANCEL', 'FAIL', cd_id),
            ('PROCESSING', 'FAIL', cd_id);
        end loop;
    end;
$$ language plpgsql;

Я не могу понять, в чем проблема получаемой ошибки:

ERROR: operator does not exist: bigint = bigint[]
No operator matches the given name and argument types. You might need to add explicit type casts.
PL/pgSQL function inline_code_block line 9 at SQL statement

Это проблема моего цикла foreach? Как исправить проблему?

0
Максим Рыбалкин 8 Июн 2021 в 17:57

2 ответа

Лучший ответ

Ошибка должна исходить от

update config_detail set ...
where id in (config_detail_ids);

Это приведет к сравнению id и config_detail_ids, что приведет к отображаемой вами ошибке.

Используйте = ANY, если вы хотите сравнить с элементами массива:

... WHERE id = ANY (config_detail_ids)
1
Laurenz Albe 8 Июн 2021 в 15:04

И нет необходимости в LOOP, используйте UNNEST (), чтобы разложить массив, и LATERAL, чтобы использовать этот результат в VALUES:

INSERT INTO change_status_transition (old_status, new_status, config_detail_id)
SELECT  *
FROM    UNNEST( ARRAY[1,2,3]) input(cd_id) -- use your array as input
    ,   LATERAL(VALUES
                ('WAIT_CANCEL', 'CANCEL', cd_id),
        ('WAIT_CANCEL', 'FAIL', cd_id),
        ('PROCESSING', 'FAIL', cd_id)
)   v(old_status, new_status, config_detail_id)
1
Frank Heikens 8 Июн 2021 в 15:10