0
    declare 
     CURSOR C1 
      IS select tgt.exp_date ,(src.eff_date - 1/(24*60*60))eff_date 
         from mira_rate tgt,mira_rate_dummy src
       where src.tc_code = tgt.tc_code and src.carrier_code = tgt.carrier_code and tgt.exp_date is null for update of tgt.exp_date;
       v_a date;
       v_b date;
        i number:=0;
      begin 
      open c1;
      loop
        fetch c1 into v_a, v_b;
        exit when c1%notfound;

        update mira_rate 
        set exp_date =v_b where current of c1;
        i:=i+1;
        end loop;

        dbms_output.put_line(i||' rows updated');

      close c1;
   commit;
      end;

クエリを実行した後、テーブルをロックしています

ORA-00054: リソースがビジーで、NOWAIT を指定して取得しています

また、ロックを削除する方法を教えてください。セッションを強制終了しようとしましたが、発生していません。それでも同じと言われます

ロック解除後。この要件をクリアしてください

select tgt.exp_date ,(src.eff_date - 1/(24*60*60))eff_date 
             from mira_rate tgt,mira_rate_dummy src
           where src.tc_code = tgt.tc_code and src.carrier_code = tgt.carrier_code and tgt.exp_date is null;

mira_rate テーブルに移動して exp_date=eff_date を更新する必要があります。

Oracle 9iを使用してimを実行する方法を教えてください。一致しないマージが機能しています

4

3 に答える 3

3

一見すると、コードにはコミットがありません。

コミットのあるコードは問題ありません。コミットするとロックが解放されます ( Oracle カーソルの例/expl )

しかし、次のことをお勧めします。

MERGE INTO mira_rate tgt
USING mira_rate_dummy src
ON (src.tc_code = tgt.tc_code and src.carrier_code = tgt.carrier_code)
WHEN MATCHED THEN UPDATE
SET exp_date= src.eff_date - 1/(24*60*60) --or just src.eff_date
WHERE tgt.exp_date is null;

これは、私が理解している限り、あなたがやりたいことです。

原則として、SQL でできることは、PL/SQL ではなく SQL で行います。

于 2013-01-25T12:18:02.007 に答える
1

「FOR UPDATE」を取り出します。

なぜそれが必要なのかを頭の中で明確にする必要がありますが、私の経験では、通常は必要ありません。

私たちの間では、これがあなたのアプローチであるべきだと言っていると思います

begin
  UPDATE mira_rate 
  SET exp_date= src.eff_date - 1/(24*60*60)
  WHERE exp_date is null;

  DBMS_OUTPUT.PUT_LINE
    (TO_CHAR(SQL%ROWCOUNT) || ' Rows Updated);

end;

ロックもカーソルも必要ありません。

それが役立つことを願っています。

編集-要件が何であるかはまだ完全にはわかりませんが、次のSQLが探しているものかもしれません。

UPDATE MIRA_RATE TGT
SET EXP_DATE = 
  (
    SELECT SRC.EFF_DATE - 1/86400 
    FROM MIRA_RATE_DUMMY SRC
    WHERE 
      SRC.TC_CODE = TGT.TC_CODE AND
      SRC.CARRIER_CODE = TGT.CARRIER_CODE
  )
WHERE
  TGT.EXP_DATE IS NULL;
于 2013-01-25T12:27:30.987 に答える