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 进行即时操作,以便在没有不匹配的情况下进行合并

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 中做的,在 SQL 中做,而不是 PL/SQL。

于 2013-01-25T12:18:02.007 回答
1

取出“用于更新”。

您需要非常清楚为什么需要它,而根据我的经验,您通常不需要。

在我们之间,我想我们是说这应该是你的方法

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 回答
0

@Satheesh,可更新选择仅适用于主键列。查看 select 是否获取主键并在 where 子句中使用它。否则更新将引发错误。有一些东西要检查 cannot modify a column which maps to a non key-preserved table 你可以加入,但更新需要主键来更新基表。

于 2017-03-01T09:45:48.437 回答