-1

hye...id、nama、jenis_rumah、sewa フィールドを含む rumah というテーブル名が 1 つあります。nama like %RIZAL% の場合は sewa フィールドを更新し、次に sewa*3 を更新する必要があります。jenis_rumah = コルネット ロットの場合、sewa を 20% 割引で更新します。これは私の pl/sql ですが、更新プロセスが失敗しています...専門家からのアドバイスが必要です。tq。

1回目の試行:

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;

2回目の試行: 別の方法で試してみると、%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;
4

2 に答える 2

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
        ;
于 2012-05-21T03:45:59.707 に答える
0

お手続きは必要ありません。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';
于 2012-05-21T03:46:00.243 に答える