2012-02-21 7 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_job_recがどこにあるか opparテーブルにはレコードがない場合があるがXYZまたはLMN。

今、私はそれが存在する場合その後、oppar_job_name=CSCLM の存在を確認する必要があります。 CSCLMに対応するジョブ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='' 

存在する場合は、その行を更新する必要があります。

さらに詳しい情報が必要な場合は、お手数ですが教えてください。

しかし、私はそれを行うことができた場合、私はoppar_job_recのための異なる値を持つ約100のレコードでこれを行う必要がありますチェックを行うのですか?

あなたはSQLのMERGE文を使用することができます

Oracle 9i Enterprise Edition release 9.2.8.0 - 64 bit Production

+0

使用しているOracleのバージョンは何ですか? – Ben

+0

My OracleのバージョンはOrcale9i Enterprise editonリリース9.2.8です。0 - 64ビットプロダクション – munish

答えて

5

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

テーブルを1回だけ通過させる方が効率的です。そのため、MERGEステートメントはおそらく良い考えです。 –

0

9imergeはオプションではありません。したがって、PL?SQLを含む2つのオプションがあります。

オプション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> 
+0

9iにMERGEが存在します。 http://www.oracle-developer.net/display.php?id=203 –

関連する問題