أوراكل دمج بيان السلوك عندما أور_روسن في استخدام شرط
-
27-10-2019 - |
سؤال
لدي بيان دمج هذا يعطيني اللعين 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
جعل بيان العمل بالنسبة لي ، ونأمل أن يساعد.