Можно ли выполнить вставку и удаление в одном запросе в Oracle10g? - PullRequest
0 голосов
/ 30 декабря 2011

Мое требование заключается в том, что мне нужно вставить некоторые записи из моей таблицы SOURCE в таблицу TARGET на основе некоторых условий [Условия, которые я получаю из таблицы ANOTHER, которая проходит через курсор].Вскоре после вставки в таблицу TARGET мне нужно удалить записи из моего SOURCE.Этот поток продолжается до тех пор, пока CURSOR не опустеет.

Поскольку в моей таблице много записей, это занимает много времени.Есть ли другой простой способ добиться этого?

Все, что я упомянул выше, это то, что я написал внутри хранимой процедуры.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011
  1. Нет, вы не можете "в том же запросе"

  2. Звучит, как будто вы совершаете много круговых поездок ис сервера.Этот может быть оптимизирован.

  3. Один из подходов может заключаться в назначении триггера для вставки (для выполнения соответствующих «удалений» без необходимости их запуска приложением)

  4. Другим может быть написание хранимой процедуры (которая выполняет все работу, возможную на стороне сервера, без любых посторонних циклов).

Эта ссылка может помочь:

http://www.devshed.com/c/a/Oracle/Developing-Simple-PL-SQL-Stored-Procedures-for-CRUD-Operations/

2 голосов
/ 30 декабря 2011

вам может потребоваться написать триггерную функцию, в которой если первичный ключ в обеих таблицах равен, то запись в таблице source , содержащая этот первичный ключ подлежит удалению.

1 голос
/ 30 декабря 2011

Оператор merge может в конечном итоге удалить некоторые совпадающие записи.

В следующем примере вы можете заметить, что на таблицу, содержащую четыре записи после слияния, могут влиять вставки, обновления и удалениявсе сразу.

SQL> create table xxx as
  2  select rownum as rn, 'xxx' as pla
  3  from dual
  4  connect by rownum < 5
  5  /

Table created
SQL> select *
  2  from xxx
  3  /

        RN PLA
---------- ---
         1 xxx
         2 xxx
         3 xxx
         4 xxx
SQL> merge into xxx tgt using (
  2         select rownum as rn,mod(rownum,2) as even_odd
  3         from dual
  4         connect by rownum < 6
  5     ) src on (tgt.rn = src.rn)
  6  when matched then update set tgt.pla = null
  7     delete where even_odd = 1
  8  when not matched then insert(rn,pla) values (src.rn,'XXX')
  9  /

5 rows merged
SQL> select *
  2  from xxx
  3  /

        RN PLA
---------- ---
         2 
         4 
         5 XXX

SQL> 
...