Условное добавление записей в таблицу - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть этот скрипт обновления, обновляющий определенные столбцы:

update oppar
set oppar_run_mode = 0,
    oppar_run_time = 0, 
    oppar_interval_ind = 'N' , 
    oppar_destination = '',
    oppar_run_date ='', 
    oppar_run_interval=''
    where ( oppar_job_name, oppar_job_rec ) 
    in 
     ( ('CSCLM' , 'XYZ')
   , ('ARCLEVEXT' , 'LMN'));

Но бывают случаи, когда в таблице нет записи oppar , где столбец oppar_job_rec - это XYZ или LMN.

Теперь мне нужно проверить существование из oppar_job_name=CSCLM тогда, если это существует. Мне нужно проверить наличие ядра Job rec, соответствующего CSCLM, т.е. oppar_job_rec=XYZ и если он не существует, мне нужно добавить новую запись с этими деталями.

oppar_job_name=CSCLM
oppar_job_rec=XYZ
oppar_run_mode = 0
oppar_run_time = 0 
oppar_interval_ind = 'N' 
oppar_destination = ''
oppar_run_date ='' 
oppar_run_interval=''

Если он существует, мне нужно обновить эту строку.

Пожалуйста, помогите и скажите мне, если вам нужна дополнительная информация.

Но как мне выполнить проверку, если это можно сделать, и мне нужно сделать это примерно на 100 записях с различными значениями для oppar_job_rec.

Oracle 9i Enterprise Edition release 9.2.8.0 - 64 bit Production

Ответы [ 2 ]

5 голосов
/ 21 февраля 2012

Вы можете использовать оператор SQL Merge: http://psoug.org/reference/merge.html

Вот пример кода:

Вместо жесткого кодирования job_name и job_rec, создайте таблицу (если их еще нет в некоторой таблице):

CREATE TABLE oppar_jobs (oppar_job_name VARCHAR2(200), 
                         oppar_job_rec VARCHAR2(200));

INSERT INTO oppar_jobs (oppar_job_name,oppar_job_rec) 
                VALUES ('CSCLM','XYZ');

INSERT INTO oppar_jobs (oppar_job_name,oppar_job_rec) 
                VALUES ('ARCLEVEXT','LMN');

Затем вы можете запустить MERGE следующим образом:

MERGE
    INTO  oppar 
    USING oppar_jobs 
    ON  ( oppar_jobs.oppar_job_name = oppar.oppar_job_name 
     AND  oppar_jobs.oppar_job_rec = oppar.oppar_job_rec)
WHEN MATCHED
THEN
    UPDATE
    SET oppar_run_mode = 0,
        oppar_run_time = 0, 
        oppar_interval_ind = 'N' , 
        oppar_destination = '',
        oppar_run_date ='', 
        oppar_run_interval=''
WHEN NOT MATCHED
THEN
    INSERT ( oppar_job_name,
             oppar_job_rec,
             oppar_run_mode,
             oppar_run_time,
             oppar_interval_ind,
             oppar_destination,
             oppar_run_date,
             oppar_run_interval)
    VALUES ( oppar_jobs.oppar_job_name,
             oppar_jobs.oppar_job_rec,
             0,
             0,
             'N',
             '',
             '',
             '');
0 голосов
/ 22 февраля 2012

Поскольку вы используете 9i merge, это не вариант; Итак, у вас есть несколько вариантов, 2, которые включают PL? SQL.

Вариант 1: обновить, затем вставить

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

Вариант 2: обновить, затем вставить с перехватом ошибок

Используя PL / SQL, вы можете сделать что-то вроде следующего,

update my_table
   set <col1> = :col1
 where <blah>

if SQL%ROWCOUNT = 0 then
   insert into my_table
   values < my values >
elsif SQL%ROWCOUNT =  1 then
   insert less...
end if;

Вариант 3: вставить, а затем обновить с перехватом ошибок

insert into my_table
values < my values >

exception when dup_val_on_index then
   update my_table
      set <col1> : :col1
    where <blah>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...