2012-02-21 45 views
0

我有這個更新腳本更新某些列:條件將記錄到表

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相關的作業記錄,例如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='' 

如果它存在,那麼我需要更新該行。

請幫助並告訴我您是否需要更多信息。

但是如何執行檢查,如果可以完成,我需要對oppar_job_rec具有不同值的約100條記錄執行此操作。

Oracle 9i Enterprise Edition release 9.2.8.0 - 64 bit Production

+0

您使用的是哪個Oracle版本? – Ben 2012-02-21 17:51:06

+0

我的Oracle版本是Orcale9i Enterprise editon版本9.2.8。0 - 64位製作 – munish 2012-02-22 05:26:53

回答

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

在表格中進行一次傳遞效率更高,因此MERGE語句可能是一個好主意。 – 2012-02-22 06:07:41

0

正如您使用9imerge不是一個選項;所以,你有很多選擇,2涉及PL?SQL。

方法1:更新然後插入

如果你不關心錯誤發生,你可以運行你的更新,然後運行您的插入。更新可能什麼也不做,插入可能會導致主鍵違例,但至少你知道一切都已完成。如果你這樣做,每個插入將不得不分開進行。

選項2:更新,然後用錯誤捕獲

使用PL/SQL,你可以做類似下面的INSERT,

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> 
+0

MERGE存在於9i中。 http://www.oracle-developer.net/display.php?id=203 – 2012-02-22 13:31:24