有条件地将记录添加到表中

时间:2012-02-21 11:52:44

标签: sql oracle plsql

我有更新脚本更新某些列:

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的存在 然后,如果存在。 我需要检查与CSCLM相对应的Job rec的存在,即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 个答案:

答案 0 :(得分:5)

您可以使用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',
             '',
             '',
             '');

答案 1 :(得分:0)

当您使用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>