我有更新脚本更新某些列:
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
答案 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>