أوراكل دمج بيان السلوك عندما أور_روسن في استخدام شرط

StackOverflow https://stackoverflow.com/questions/9332093

سؤال

لدي بيان دمج هذا يعطيني اللعين ORA-00904: invalid identifier رسالة خطأ.لاحظ أن المشكلات النموذجية المتعلقة بخطأ" المعرف غير الصالح " غير موجودة هنا - لا أحاول تحديث العمود المرتبط ، ولا أخطأ في كتابة أسماء الأعمدة الخاصة بي.I صباحا محاولة استخدام العمود الزائف أوراكل ORA_ROWSCN في ال USING البند SELECT بيان.

مع هذه الجداول عينة ، وأنا أحاول تشغيل

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);

إذا قمت بدلا من ذلك بوضع الاستعلام في طريقة عرض ، يمكنني بعد ذلك استخدام أورا_روسن بنجاح:

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);

هل هناك أي طريقة للقيام بذلك دون إنشاء طريقة عرض للاستعلام?لا بد لي من القيام بذلك على العديد من الجداول كجزء من عملية إيتل ، ويفضل أن لا يكون لبناء العديد من وجهات النظر.

تحرير:بناء على اقتراح جلين في التعليقات ، حاولت وضع الاستعلام في استعلام فرعي:

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 رسالة خطأ.

وهنا دل لإعادة القضية.

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);
هل كانت مفيدة؟

المحلول

ركضت سكل الخاص بك وحصلت على نفس الخطأ (على 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 خطأ.ثم لاحظت أنه في دل الخاص بك ، العمود على MY_SOURCE_TABLE يسمى UPDATED_DT (أي.مع اضافية D حرف).تغيير الإشارات إلى ذلك في الخاص بك MERGE جعل بيان العمل بالنسبة لي ، ونأمل أن يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top