Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有条件地将记录添加到表中_Sql_Oracle_Plsql - Fatal编程技术网

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

Sql 有条件地将记录添加到表中,sql,oracle,plsql,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 ( (

我得到了更新某些列的更新脚本:

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\u job\u rec是XYZ或LMN

现在我需要验证
oppar\u job\u name=CSCLM
如果存在的话。 我需要检查是否存在与CSCLM相关的作业记录,即
oppar\u Job\u 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 9.2.8.0版-64位生产版

您可以使用SQL合并语句:

下面是一些示例代码:

不要硬编码作业名称和作业记录,而是构建一个表(如果它们不在某些表中):

然后可以按如下方式运行合并:

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',
             '',
             '',
             '');

您可以使用SQL合并语句:

下面是一些示例代码:

不要硬编码作业名称和作业记录,而是构建一个表(如果它们不在某些表中):

然后可以按如下方式运行合并:

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',
             '',
             '',
             '');

当您使用
9i
时,合并
不是一个选项;因此,您有许多选项,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;
更新我的表格
set=:col1
哪里
如果SQL%ROWCOUNT=0,则
插入到我的表中
价值观<我的价值观>
如果SQL%ROWCOUNT=1,则
插入更少的。。。
如果结束;
选项3:插入,然后用错误捕捉更新

插入到我的表格中
价值观<我的价值观>
当dup_val_在索引上时出现异常
更新我的表格
集合::col1
哪里

当您使用
9i
时,合并
不是一个选项;因此,您有许多选项,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;
更新我的表格
set=:col1
哪里
如果SQL%ROWCOUNT=0,则
插入到我的表中
价值观<我的价值观>
如果SQL%ROWCOUNT=1,则
插入更少的。。。
如果结束;
选项3:插入,然后用错误捕捉更新

插入到我的表格中
价值观<我的价值观>
当dup_val_在索引上时出现异常
更新我的表格
集合::col1
哪里

您使用的Oracle版本是什么?我的Oracle版本是Orcale9i Enterprise editon release 9.2.8.0-64位产品您使用的Oracle版本是什么?我的Oracle版本是Orcale9i Enterprise editon release 9.2.8.0-64位产品只需在表中传递一次,效率更高,因此,MERGE语句可能是个好主意。只在表中传递一次更有效,因此MERGE语句可能是个好主意。