Plsql 将同一字段更新两次

Plsql 将同一字段更新两次,plsql,Plsql,hye…我有一个表名rumah,其中包含id、nama、jenis_rumah和sewa字段。当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); j

hye…我有一个表名rumah,其中包含id、nama、jenis_rumah和sewa字段。当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%这样的nama被更新

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;

您不需要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
        ;

你不需要一个程序。只需运行2条update语句

UPDATE rumah
   SET sewa = sewa*3
 where upper (nama) like '%RIZAL%';


UPDATE rumah
   SET sewa = (sewa * 80/100)
 where jenis_rumah = 'CORNER LOT';

为什么需要这样的过程?谢谢,但存在数据类型不一致的错误:预期数量已达到CHAR@user1407005sewa的数据类型是什么?谢谢,但我不想手动运行它,这就是为什么我需要放入过程中的原因。你认为呢???@user1407005,你也可以在程序中添加更新。但塞伯内特的解决方案可能更优雅一些。