2017-09-15 7 views
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クエリの前にカーソルを置き、回避するのか?

+0

フェッチオプションで 'ckStatic'カーソルの種類を使用していますか?トランザクションを使用していますか?どのFireDACコンポーネントですか?どのバージョンのDelphiですか?これをブロックで実行することを検討しましたか?私は東京で何が起こるか見ることができます、ただその決定につながったものを見直したいと思います。 – Victoria

+0

@Victoria:どうもありがとうございます。それは 'ckAutomatic'だった。私はそれを 'ckDefault'に変更しました。お願いします。 – Paul

答えて

0

ビクトリアので、ここで答えている、彼女のポイントを取得する必要はありません。

カーソル種類のオプションをフェッチはckAutomaticに設定しました。私はそれをckDefaultに変更しました。

関連する問題