1
私はPG管理IIIで次のクエリを実行すると、それが正常に動作して、クエリの前に:FireDACは、DECLARE CURSORの
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は文句:
構文を文字「3535」の「INSERT」付近のエラー
WindowsエラーログへのPostgreSQLロギングを有効にして、以下を参照してください。
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
)
私がPG Admin IIIでDECLARE "10STM" CURSOR WITH HOLD FOR
と同じコードを実行すると、まったく同じエラーになります。
なぜFireDACがPGクエリの前にカーソルを置き、回避するのか?
フェッチオプションで 'ckStatic'カーソルの種類を使用していますか?トランザクションを使用していますか?どのFireDACコンポーネントですか?どのバージョンのDelphiですか?これをブロックで実行することを検討しましたか?私は東京で何が起こるか見ることができます、ただその決定につながったものを見直したいと思います。 – Victoria
@Victoria:どうもありがとうございます。それは 'ckAutomatic'だった。私はそれを 'ckDefault'に変更しました。お願いします。 – Paul