oracle update用法 - 受PL / SQL中的UPDATE影響的行數




update語法 select (6)

我有一個PL / SQL函數(在Oracle 10g上運行),其中我更新了一些行。 有沒有辦法找出有多少行受UPDATE影響? 當手動執行查詢時,它告訴我有多少行受到影響,我想在PL / SQL中獲取該數字。


Answers

請試試這個..

create table client (
  val_cli integer
 ,status varchar2(10)
);

---------------------
begin
insert into client
select 1, 'void' from dual
union all
select 4, 'void' from dual
union all
select 1, 'void' from dual
union all
select 6, 'void' from dual
union all
select 10, 'void' from dual;
end;

---------------------
select * from client;

---------------------
declare
  counter integer := 0;
begin
  for val in 1..10
    loop
      update client set status = 'updated' where val_cli = val;
      if sql%rowcount = 0 then
        dbms_output.put_line('no client with '||val||' val_cli.');
      else
        dbms_output.put_line(sql%rowcount||' client updated for '||val);
        counter := counter + sql%rowcount;
      end if;
  end loop;
   dbms_output.put_line('Number of total lines affected update operation: '||counter);
end;

---------------------
select * from client;

--------------------------------------------------------

結果如下所示:

2客戶更新為1
沒有2個val_cli的客戶端。
沒有3個val_cli的客戶端。
1個客戶更新了4個
沒有5個val_cli的客戶端。
1個客戶更新了6個
沒有7個val_cli的客戶端。
沒有8個val_cli的客戶端。
沒有客戶與9 val_cli。
1個客戶更新為10個
受影響的更新操作總數:5


對於那些希望得到明確命令結果的人,解決方案可能是:

begin
  DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.');
end;

基本問題是SQL%ROWCOUNT是一個PL / SQL變量(或函數),不能直接從SQL命令中訪問。 通過使用非名稱的PL / SQL塊,可以實現這一點。

...如果有人有解決方案在SELECT命令中使用它,我會感興趣。


或者, SQL%ROWCOUNT你可以在程序中使用它,而不需要聲明一個變量


你使用sql%rowcount變量。

您需要在聲明後直接調用它以查找受影響的行數。

例如:

DECLARE
    i number;
BEGIN
    UPDATE employees
    SET status = 'fired'
    WHERE name like '%Bloggs';
    i := sql%rowcount;
END;

SQL%ROWCOUNT也可以在不被分配的情況下使用(至少從Oracle 11g )。

只要在當前塊內沒有執行任何操作(更新,刪除或插入), SQL%ROWCOUNT就會設置為空。 然後它保持受最後一次DML操作影響的行數:

說我們有表客戶

create table client (
  val_cli integer
 ,status varchar2(10)
)
/

我們會這樣測試它:

begin
  dbms_output.put_line('Value when entering the block:'||sql%rowcount);

  insert into client 
            select 1, 'void' from dual
  union all select 4, 'void' from dual
  union all select 1, 'void' from dual
  union all select 6, 'void' from dual
  union all select 10, 'void' from dual;  
  dbms_output.put_line('Number of lines affected by previous DML operation:'||sql%rowcount);

  for val in 1..10
    loop
      update client set status = 'updated' where val_cli = val;
      if sql%rowcount = 0 then
        dbms_output.put_line('no client with '||val||' val_cli.');
      elsif sql%rowcount = 1 then
        dbms_output.put_line(sql%rowcount||' client updated for '||val);
      else -- >1
        dbms_output.put_line(sql%rowcount||' clients updated for '||val);
      end if;
  end loop;  
end;

導致:

Value when entering the block:
Number of lines affected by previous DML operation:5
2 clients updated for 1
no client with 2 val_cli.
no client with 3 val_cli.
1 client updated for 4
no client with 5 val_cli.
1 client updated for 6
no client with 7 val_cli.
no client with 8 val_cli.
no client with 9 val_cli.
1 client updated for 10

這是您混亂的快速解決方案。

SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1

在這裡你可以通過填充N = 0,第二個最後N = 1,第四個最後一個填充N = 3等等來獲得最後一行。

這是面試中很常見的問題,這是非常簡單的答案。

進一步如果你想要的金額,ID或一些數字排序順序可能會去CAST函數在MySQL中。

SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1

在這里通過填充N = 4您將能夠從CART表中獲得最高金額的第五最後記錄。 你可以適合你的領域和表名,並提出解決方案。







oracle plsql sql-update