2012-02-17 19 views
3

私には恐ろしいORA-00904: invalid identifierというエラー・メッセージを与えるMERGE文があります。 「無効な識別子」エラーの典型的な問題はここにはないことに注意してください。結合された列を更新しようとしているわけではなく、列名のスペルを間違えていることもありません。 I USING句のSELECTステートメントでoracle pseudo-column ORA_ROWSCNを使用しようとしました。これらのサンプルテーブルとora_rowscnがUSING句の中にある場合のOracle Merge文の動作

、私は疑似を削除ORA_ROWSCN USING句から、私はもはや、エラーメッセージが表示されず、マージが正常に完了した場合

MERGE INTO MY_MERGE_TABLE D 
    USING 
(SELECT PRIMARY_KEY, 
     COALESCE (UPDATE_DT, CREATED_DT) update_dt, 
     ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE) S 
    ON (D.PRIMARY_KEY = S.PRIMARY_KEY) 
WHEN MATCHED THEN 
    UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt), 
       D.rowscn = GREATEST(D.rowscn, S.rowscn) 
WHEN NOT MATCHED THEN 
    INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN) 
    VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN); 

を実行してみてください。

MERGE INTO MY_MERGE_TABLE D 
    USING 
(SELECT PRIMARY_KEY, 
     COALESCE (UPDATE_DT, CREATED_DT) update_dt 
    FROM MY_SOURCE_TABLE) S 
    ON (D.PRIMARY_KEY = S.PRIMARY_KEY) 
WHEN MATCHED THEN 
    UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt) 
WHEN NOT MATCHED THEN 
    INSERT (D.PRIMARY_KEY, D.UPDATE_DT) 
    VALUES (S.PRIMARY_KEY, S.UPDATE_DT); 

私が代わりにビューにクエリを配置する場合、私はその後、正常ORA_ROWSCNを使用することができます。

CREATE VIEW MY_VIEW AS 
    SELECT PRIMARY_KEY, 
     COALESCE (UPDATE_DT, CREATED_DT) update_dt, 
     ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE; 

MERGE INTO MY_MERGE_TABLE D 
    USING (SELECT PRIMARY_KEY, UPDATE_DT, ROWSCN FROM MY_VIEW) S 
    ON (D.PRIMARY_KEY = S.PRIMARY_KEY) 
WHEN MATCHED THEN 
    UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt), 
       D.rowscn = GREATEST(D.rowscn, S.rowscn) 
WHEN NOT MATCHED THEN 
    INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN) 
    VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN); 

は、クエリのVIEWを作成せずにこれを行う方法はありますか? ETLプロセスの一環として、多くの表でこれを実行しなければならず、いくつかのビューを作成する必要はありません。

EDIT: コメントでグレンの提案に基づいて、私はサブクエリにクエリを入れてみました:

MERGE INTO MY_MERGE_TABLE D 
    USING 
(WITH QRY AS 
    (SELECT PRIMARY_KEY, 
     COALESCE (UPDATE_DT, CREATED_DT) update_dt, 
     ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE) 
    SELECT ORDER_ID, UPDATE_DT, ROWSCN FROM QRY) 
ON (D.PRIMARY_KEY = S.PRIMARY_KEY) 
WHEN MATCHED THEN 
    UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt), 
       D.rowscn = GREATEST(D.rowscn, S.rowscn) 
WHEN NOT MATCHED THEN 
    INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN) 
    VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN); 

このクエリは、まだ私にORA-00904: invalid identifierエラーメッセージを表示します。

ここに問題を再現するDDLがあります。

CREATE TABLE MY_SOURCE_TABLE (
    PRIMARY_KEY NUMBER, 
    CREATED_DT TIMESTAMP(6), 
    UPDATED_DT TIMESTAMP(6) 
); 

CREATE TABLE MY_MERGE_TABLE (
    PRIMARY_KEY NUMBER, 
    UPDATED_DT TIMESTAMP(6), 
    ROWSCN NUMBER 
); 

INSERT INTO MY_SOURCE_TABLE (PRIMARY_KEY, CREATED_DT, UPDATED_DT) 
VALUES (1, SYSDATE-2, SYSDATE); 

INSERT INTO MY_SOURCE_TABLE (PRIMARY_KEY, CREATED_DT, UPDATED_DT) 
VALUES (2, SYSDATE-1, NULL); 

INSERT INTO MY_SOURCE_TABLE (PRIMARY_KEY, CREATED_DT, UPDATED_DT) 
VALUES (3, SYSDATE-1, SYSDATE+1); 

INSERT INTO MY_MERGE_TABLE (PRIMARY_KEY, UPDATED_DT, ROWSCN) 
VALUES (1, SYSDATE-2, 0); 

INSERT INTO MY_MERGE_TABLE (PRIMARY_KEY, UPDATED_DT, ROWSCN) 
VALUES (2, SYSDATE-1, 0); 
+0

11.2.0.1では、merge文がうまく動作します。 DDLといくつかのサンプルデータを投稿する必要があるかもしれません。 –

+0

この質問の受け入れられた答えのように "using" select句でサブクエリ分解を使用できますか?http://stackoverflow.com/questions/6673806/oracle-with-clause-merge-syntax-error/6673940#6673940 – Glenn

+0

@jonearles - USING句の一部としてSELECT文で疑似列ORA_ROWSCNを使用している場合、マージ・ステートメントは機能しますか?私はそれなしですべての時間をマージして使用しても問題ありません。私はこの問題を抱えています。 –

答えて

5

SQLを実行しても同じエラーが発生しました(11.2.0.1)。次に選択を実行しようとしました

SELECT PRIMARY_KEY, 
     COALESCE (UPDATE_DT, CREATED_DT) update_dt, 
     ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE; 

まだORA-00904: "UPDATE_DT": invalid identifierエラーが発生しました。 DDLでMY_SOURCE_TABLEの列がUPDATED_DT(つまり、余分なD文字)であることに気付きました。あなたのMERGEステートメントのそれへの参照を変更すると、それは私のために働いていました。

+0

+1誰にも何もないことに気づいてください! – Ben

+0

ありがとうございました!私はそれがばかげたものだったとは信じられません... –

関連する問題