#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
.