Почему не работает этот оператор слияния? - PullRequest
1 голос
/ 03 июня 2011

Я провел большую часть дня, пытаясь определить, почему оператор слияния не работает, и я начинаю думать, что проблема должна быть чем-то немного экзотическим.

В моей базе данных есть десятки процедур PL / SQL, которые используют операторы слияния, но я абсолютно не могу заставить их работать. Хотя он намного больше показанного в примере, я сократил его, чтобы он обновлял только пару столбцов и все равно не скомпилировал.

Ошибка: 'ORA-00904 "псевдоним". "Column_name" неверный идентификатор ". Как правило, это означает, что имя столбца было введено с ошибкой или, в случае слияния, вы пытаетесь обновить поле, которое используется в объединении. Это определенно НЕ тот случай. Я четыре раза проверил, и имена столбцов верны, все они существуют, и формат выражения точно такой же, как и во многих других местах.

    /** 
    Result: ORA-00904 "P"."SFDC_CUST_CONTACT_PK": invalid identifier

    I'm certain that the table and column names are all correct.

    If I join on any of the dozen or so other columns instead, I 
    get the exact same error.

    Note: I'm NOT attempting to update the column that I join
    against.


    **/

    merge into customer_contact c
    using (select p.fax_number,
           p.email
    from sfdc_cust_contact_temp p
    ) p
    on (p.sfdc_cust_contact_pk = c.sfdc_cust_contact_pk)
    when matched then
      update set 
      c.fax_number = p.fax_number,
      c.email = p.email;


    /*** 

    This works fine on the same machine 

    **/ 
    merge into customer_contact_legacy c
    using (select ct.contact_legacy_pk, 
          ct.fax_number,
          ct.email 
    from customer_contact_temp ct 
    ) ct
    on (upper(trim(ct.contact_legacy_pk)) = upper(trim(c.contact_legacy_pk)))
    when matched then
      update set 
      c.fax_number = ct.fax_number,
      c.email = ct.email;

Есть идеи, что еще здесь может быть не так? Может ли быть какой-либо тип повреждения с таблицей?

Версия 10g.

1 Ответ

4 голосов
/ 03 июня 2011

Похоже, что в предложении using отсутствует столбец, к которому вы пытаетесь присоединиться.

Ваш код:

merge into customer_contact c
using (select p.fax_number,
       p.email
from sfdc_cust_contact_temp p
) p
on (p.sfdc_cust_contact_pk = c.sfdc_cust_contact_pk)

Потенциальное исправление:

merge into customer_contact c
using (select p.sfdc_cust_contact_pk,
       p.fax_number,
       p.email
from sfdc_cust_contact_temp p
) p
on (p.sfdc_cust_contact_pk = c.sfdc_cust_contact_pk)
...