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指定获取
另外请告诉我如何移除锁我试图杀死它没有发生的sesssion。它说同样的
取消锁定。请告诉我这个要求
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进行合并,以便合并而不匹配正在运行
答案 0 :(得分:3)
乍一看,代码中没有提交。
提交的代码可以。 Commit将释放锁(Oracle cursor examples/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。
答案 1 :(得分: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可能就是您要找的。 p>
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;
答案 2 :(得分:0)
@Satheesh,Updatable select仅适用于主键列。查看select是否获取主键并在where子句中使用它。否则更新将抛出错误。
有一些东西要检查
cannot modify a column which maps to a non key-preserved table
您可以加入,但更新需要主键在基表中进行更新。