FireDAC предшествует запросу с DECLARE CURSOR

Когда я выполняю следующий запрос в PG Admin III, он работает нормально:

WITH new_values (updated_at,talker_id,sentence_id,v0,v1,v2,v3,v4,v5) AS (
    VALUES (current_timestamp,'2','3','4','5','6','7','8','9')
),
UPSERT AS (
    UPDATE utel u
    SET
        updated_at=nv.updated_at,
        v0=nv.v0,v1=nv.v1,v2=nv.v2,v3=nv.v3,v4=nv.v4,v5=nv.v5
    FROM
        new_values nv
    WHERE
        u.talker_id=nv.talker_id AND u.sentence_id=nv.sentence_id RETURNING u.*
)
INSERT into utel (updated_at,talker_id,sentence_id,v0,v1,v2,v3,v4,v5)
SELECT updated_at,talker_id,sentence_id,v0,v1,v2,v3,v4,v5
FROM new_values WHERE NOT EXISTS(
    SELECT 1 FROM upsert up
    WHERE
        up.talker_id=new_values.talker_id
        AND up.sentence_id=new_values.sentence_id
)

но когда я пытаюсь выполнить его через TFDQuery, PostgreSQL жалуется:

синтаксическая ошибка в или около "INSERT" в символе 355

Я включил запись PostgreSQL в журнал ошибок Windows и увидел следующее:

DECLARE "10STM" CURSOR WITH HOLD FOR
WITH new_values (updated_at,talker_id,sentence_id,v0,v1,v2,v3,v4,v5) AS (
    VALUES (current_timestamp,'2','3','4','5','6','7','8','9')
),
UPSERT AS (
    UPDATE utel u
    SET
        updated_at=nv.updated_at,
        v0=nv.v0,v1=nv.v1,v2=nv.v2,v3=nv.v3,v4=nv.v4,v5=nv.v5
    FROM
        new_values nv
    WHERE
        u.talker_id=nv.talker_id AND u.sentence_id=nv.sentence_id RETURNING u.*
)
INSERT into utel (updated_at,talker_id,sentence_id,v0,v1,v2,v3,v4,v5)
SELECT updated_at,talker_id,sentence_id,v0,v1,v2,v3,v4,v5
FROM new_values WHERE NOT EXISTS(
    SELECT 1 FROM upsert up
    WHERE
        up.talker_id=new_values.talker_id
        AND up.sentence_id=new_values.sentence_id
)

Когда я выполняю то же самое с DECLARE "10STM" CURSOR WITH HOLD FOR в PG Admin III, я получаю точно такую ​​​​же ошибку.

Почему FireDAC ставит перед запросом PG курсор и как этого избежать?


person Paul    schedule 15.09.2017    source источник
comment
Используете ли вы тип курсора ckStatic (в параметрах выборки)? Используете ли вы транзакции? Какой компонент FireDAC? Какая версия Делфи? Рассматривали ли вы выполнение этого в блоке? Я вижу, что происходит в Токио, просто хочу посмотреть, что привело к такому решению.   -  person Victoria    schedule 15.09.2017
comment
@Victoria: Большое спасибо. Это было ckAutomatic. Я изменил его на ckDefault, и теперь он работает. Пожалуйста, получите свои баллы.   -  person Paul    schedule 05.10.2017


Ответы (1)


Виктория не хочет получать свои баллы, поэтому вот ответ:

Тип курсора в параметрах выборки был установлен на ckAutomatic. Я изменил его на ckDefault, и теперь он работает.

person Paul    schedule 01.11.2017