hye ...我有一个包含id,nama,jenis_rumah和sewa字段的表名rumah。当nama喜欢%RIZAL%时,我需要更新sewa字段,然后更新sewa * 3。如果jenis_rumah =短号很多,那么以20%的折扣更新sewa。这是我的pl / sql,但更新过程失败...需要专家的建议。 TQ
第一次试验:
DECLARE CURSOR rec IS
SELECT id, nama, jenis_rumah, sewa
FROM rumah;
nama varchar2 (100);
jenis_rumah varchar2(100);
upd_cntr NUMBER := 0;
tot_all NUMBER :=0;
BEGIN
FOR z1 IN rec LOOP
if upper (nama) like '%RIZAL%' then
begin
UPDATE rumah
SET sewa = sewa*3
where id = z1.id ;
end;
elsif jenis_rumah = 'CORNER LOT' THEN
Begin
UPDATE rumah
SET sewa = (sewa * 80/100)
where id = z1.id;
end;
END IF;
upd_cntr := upd_cntr + 1;
tot_all := tot_all + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total Updated Sewa:' || tot_all);
END;
第二次试用: 我尝试了不同的方式,只有%RIZAL%更新
DECLARE CURSOR rec IS
SELECT id, nama, jenis_rumah, SUM (sewa*3) AS upd_sewa
FROM rumah
WHERE UPPER (nama) LIKE '%RIZAL%'
GROUP BY id, nama, jenis_rumah, sewa;
jenis_rumah varchar2(100);
upd_cntr NUMBER := 0;
tot_all NUMBER :=0;
BEGIN
FOR z1 IN rec LOOP
UPDATE rumah
SET sewa = z1.upd_sewa
where id = z1.id ;
IF jenis_rumah = 'CORNER LOT' THEN
UPDATE rumah
SET sewa = (sewa * 80/100);
END IF;
upd_cntr := upd_cntr + 1;
tot_all := tot_all + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total Updated Sewa:' || tot_all);
END;
答案 0 :(得分:4)
您不需要PL / SQL来实现您的目标。
请改为尝试:
UPDATE rumah
SET sewa =
CASE
WHEN UPPER(nama) LIKE '%RIZAL%' THEN sewa*3
WHEN jenis_rumah = 'CORNER LOT' THEN (sewa * 80/100)
ELSE sewa
END
;
答案 1 :(得分:0)
您不需要手术。只需运行2个更新语句。
UPDATE rumah
SET sewa = sewa*3
where upper (nama) like '%RIZAL%';
UPDATE rumah
SET sewa = (sewa * 80/100)
where jenis_rumah = 'CORNER LOT';