Оператор слияния Oracle SQL только с 1 таблицей и кучей значений

Я использую Spring JDBC и оракул SQL.

используя класс SpringJDBC MapSqlParameterSource, я сопоставил данные, которые хочу объединить.

Теперь я хочу использовать оператор слияния для обновления/вставки таблицы базы данных. Все, что у меня есть, это одна таблица и куча параметров, которые я хочу слить в нее.

 merge into proj.person_registry pr
using ( ! parameters should go here somehow? )
on (pr.id = :id or pr.code = :code)
when matched then 
update set pr.code             = :code,
        pr.name                 = :name,
        pr.firstname            = :firstname,
        pr.cl_gender            = :cl_gender,
        pr.cl_status            = :cl_status,
        pr.aadress              = :aadress,
        pr.aadress_date         = :aadress_date 
when not matched then
insert values (:code, :name, :firstname, :cl_gender, :cl_status, ;aadress, :aadress_date);

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

также есть два уникальных ключа pr.id и pr.code. Иногда параметр :id имеет значение null, когда это происходит, я хочу получить оператор обновления на основе сопоставления pr.code с :code. Будет ли это работать, если мое обновление содержит строку:

update set pr.code             = :code,

person ollo    schedule 13.04.2012    source источник
comment
Ключевое слово :using (параметры ! должны быть здесь каким-то образом? ). Должен ли я каким-то образом создать временную таблицу и поместить ее после использования или есть какой-то другой способ получить мои значения в этом предложении слияния. И если нет другого пути, как мне сделать временную таблицу?   -  person ollo    schedule 13.04.2012
comment
Нет, вам не нужна временная таблица... Проверьте синтаксис слияния по этой ссылке. "nofollow noreferrer">docs.oracle.com/cd/B19306_01/server.102/b14200/   -  person Teja    schedule 13.04.2012
comment
Я так понимаю, мне нужно использовать подзапрос. Как создать приемлемый подзапрос с чистыми значениями параметров, Spring заменяет :code нормальным значением «123455». Также меня смущает это ограничение: вы не можете обновить столбец, на который ссылается условие ON. - так как я хочу обновить pr.code, когда :id не равен нулю..   -  person ollo    schedule 13.04.2012
comment
Можете ли вы опубликовать полный запрос и ошибку, которую вы получаете...   -  person Teja    schedule 13.04.2012
comment
На данный момент это полный запрос, я не знаю, как его закончить, и у меня нет обходного пути. Проблема ограничения, которую я, вероятно, могу понять. Мне нужно проанализировать, нужно ли мне обновлять pr.code или он всегда соответствует значению БД, если: id не равен нулю. Рабочие дни закончились :D Вернусь к этому позже.   -  person ollo    schedule 13.04.2012


Ответы (1)


Это должно работать:

merge into proj.person_registry pr
using ( 
  select 42 as id
         'xyz' as code,
         'Dent' as name,
         'Arthur' as firstname,
         'male' as cl_gender
         'closed' as cl_status,
         'Somewher' as aaddress,
         current_date as aaddress_date
   from dual
) t on (pr.id = t.id or pr.code = t.code)
when matched then 
update set pr.code             = t.code,
        pr.name                 = t.name,
        pr.firstname            = t.firstname,
        pr.cl_gender            = t.cl_gender,
        pr.cl_status            = t.cl_status,
        pr.aadress              = t.aadress,
        pr.aadress_date         = t.aadress_date 
when not matched then
insert values (t.code, t.name, t.firstname, t.cl_gender, t.cl_status, ;aadress, t.aadress_date);

Я не знаком с шаблоном Spring JDBC, но замена фактических значений в запросе select ... from dual заполнителями параметров должна работать.

person a_horse_with_no_name    schedule 13.04.2012
comment
Спасибо, это почти работает. Единственная оставшаяся проблема заключается в том, что я не могу обновить pr.code, потому что ссылаюсь на него в предложении ON: on (pr.id = t.id or pr.code = t.code). Это не проблема, если я ввожу обновление с pr.code = t.code, но если я ввожу его с pr.id = t.id, pr.code нужно обновить.. - person ollo; 16.04.2012
comment
В любом случае, почему это ограничение на предложение слияния? - person ollo; 16.04.2012