Oracle: вставить, если не существует или обновление не работает

#sql #oracle #oracle11g #sql-update #sql-insert

#sql #Oracle #oracle11g #sql-обновление #sql-вставка

Вопрос:

Я пытаюсь вставить, если запись не существует, в противном случае обновите для следующей таблицы.Однако он говорит, что вставлено 0 0 строк.Но когда я тестирую свой оператор select, он возвращает 1.

 create table tb_coba2 (id number , nis number , nilai_b number , semester number);
  

Запрос :

 insert into TB_COBA2 (nis , nilai_b , semester)
     select :nis , :nilai_a , :semester
      from dual
      where not exists (
       select 1 from tb_coba2
      where nis = :nis and semester = :semester
      );
      commit;


alter table tb_coba2 add constraint tb_coba2_uq unique ( nis, semester );
  

Следующий запрос возвращает 1 после первой вставки, но если я запускаю полную вставку, он сообщает, что вставлено 0 записей.

выберите 1 из tb_coba2, где nis = :nis и семестр = :семестр

Что я здесь делаю не так.?

Ответ №1:

Ваш исходный код выполняет то, для чего он предназначен, то есть: вставьте строку, если данные (nis, semester) еще не существуют в таблице.

Однако в вашем вопросе упоминается, что вы также хотите обновить, когда запись уже существует:

Я пытаюсь вставить, если запись не существует, в противном случае обновить

В Oracle merge для этого используется оператор. Основываясь на вашем описании проблемы, это будет:

 merge into tb_coba2 t
using (select :nis nis, :nilai_a nilai_a, :semester semester from dual) s
on (s.nis = t.nis and s.semester = t.semester)
when matched then update set t.nilai_a = s.nilai_a
when not matched then insert (nis, nilai_a, semester) values (s.nis, s.nilai_a, s.semester)
  

Комментарии:

1. @Rocky4Ever: ваш существующий запрос просто обрабатывает часть вопроса insert if not exists (и делает это правильно). Однако он не будет обновлять существующие строки, о чем, похоже, вы спрашиваете. Отсюда мое предложение использовать merge .