oracle遊標(一)

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   使用   ar   strong   for   

1.遊標概念

 在PL/SQL塊中執行SELECT、INSERT、DELETE和UPDATE語句時,ORACLE會在記憶體中為其分配上下文區(Context Area),即緩衝區。遊標是指向該區的一個指標,或是一種結構化資料類型。它提供了一種對具有多行資料查詢結果集中的每一行資料分別進行單獨處理的方法,是設計嵌入式SQL語句的應用程式的常用編程方式。

 

2.遊標使用

遊標分為兩種;

  1,隱式遊標

  2,顯示遊標,

 

A,隱式遊標

隱式遊標是當執行sql語句時自動建立的,當沒有聲明顯示遊標時,程式是無法控制隱式遊標的。

當執行DML語句(insert,update 和 delete)時,隱式遊標就會自動建立,對於insert操作,遊標控制插入的資料,對於delete,update,遊標會記錄影響的行數

注意:任何遊標都能訪問 sql%attribute_name .

 

遊標屬性

 

屬性

描述

%FOUND

 

如果insert,update,delete 執行影響了行數,或者select into 有返回的行數,意思就是有記錄被更新,則返回true,否則返回false.

%NOTFOUND

跟上面相反,沒有記錄被更新則返回true,否則返回false.

%ISOPEN

對於隱式遊標總是返回false,因為oracle在執行相關的sql語句後會自動關閉。

對於顯示遊標,如果被開啟了,就返回true,否則返回false.

%ROWCOUNT

返回受影響的行數.當執行Insert,update 或delete語句時,或者是select into 時

 

隱式遊標屬性

屬性

SELECT

INSERT

UPDATE

DELETE

SQL%ISOPEN

 

FALSE

FALSE

FALSE

FALSE

SQL%FOUND

TRUE

有結果

 

成功

成功

SQL%FOUND

FALSE

沒結果

 

失敗

失敗

SQL%NOTFUOND

TRUE

沒結果

 

失敗

失敗

SQL%NOTFOUND

FALSE

有結果

 

成功

失敗

SQL%ROWCOUNT

 

返回行數,只為1

插入的行數

修改的行數

刪除的行數

 

看例子的前提還是先準備資料

 

drop table customer;create table customer(name varchar(100) primary key,age int,address varchar(100),salary decimal)delete from customer;insert into customer values (‘jack‘,22,‘Singapore‘,5000.00);insert into customer values (‘rose‘,22,‘Japan‘,2000.00);insert into customer values (‘Jet‘,32,‘HongKong‘,7000.00);insert into customer values (‘John‘,30,‘American‘,5000.00);insert into customer values (‘Merry‘,25,‘Singapore‘,3000.00);insert into customer values (‘Peter‘,26,‘China‘,1000.00);insert into customer values (‘Adi‘,27,‘India‘,2400.00);select * from customerselect * from customer where salary <3000
View Code

 

例1;

例1,set serveroutput on;DECLARE    total_rows number(2);BEGIN   UPDATE customer   SET salary = salary + 500   where salary < 3000;   IF sql%notfound THEN      dbms_output.put_line(‘no customers selected‘);   ELSIF sql%found THEN      total_rows := sql%rowcount;      dbms_output.put_line( total_rows || ‘ customers selected ‘);   END IF; END;/
View Code

 

結果:

3 customers selected

查看資料會發現,資料庫更新了3條記錄。

大多數時候我們還是使用的顯示遊標,這樣更加容易去控制。

 

B,顯示遊標

 

遊標的聲明:

    CURSOR cursor_name[(parameter[, parameter]…)]               [RETURN datatype]    IS         select_statement;

 

 

實用顯示遊標會有以下4個步驟;

 

  • 聲明遊標初始化記憶體
  • 開啟遊標分配記憶體
  • Fetch cursor 擷取記錄
  • 關閉遊標釋放記憶體

 

  1. 聲明遊標
CURSOR c1 is select name, salary from customer;

    2,開啟遊標分配記憶體

OPEN c1;    

    3,擷取記錄

FETCH c1 INTO c_name, c_salary;

 4,關閉遊標

CLOSE c_1;

 

下面看一個簡單使用顯示遊標的完整例子

 

例2;

 

set serveroutput on;DECLARE    c_salary customer.salary%TYPE;   c_name customer.name%TYPE;   CURSOR c1 is   select name,salary from customer;BEGIN  open c1;  loop  fetch c1 into c_name,c_salary;  exit when c1%notfound ;   dbms_output.put_line(c_name||‘ ‘||c_salary);  end loop;  close c1;END;/
View Code

 

結果;

jack 5000rose 2500Jet 7000John 5000Merry 3000Peter 1500Adi 2900
View Code

 

 

PL/SQL語言提供了遊標FOR迴圈語句,自動執行遊標的OPEN、FETCH、CLOSE語句和迴圈語句的功能;當進入迴圈時,遊標FOR迴圈語句自動開啟遊標,並提取第一行遊標資料,當程式處理完當前所提取的資料而進入下一次迴圈時,遊標FOR迴圈語句自動提取下一行資料供程式處理,當提取完結果集合中的所有資料行後結束迴圈,並自動關閉遊標。

 

  FOR index_variable IN cursor_name[(value[, value]…)] LOOP    -- 遊標資料處理代碼  END LOOP;

 

用for loop,可以完成上面例2同樣的效果。

例3;

  

set serveroutput on;DECLARE    c_salary customer.salary%TYPE;   c_name customer.name%TYPE;   CURSOR c1 is   select name,salary from customer;BEGIN for f in c1  loop   dbms_output.put_line(f.name||‘ ‘||f.salary);  end loop;END;/
View Code

 

帶參數的遊標

set serveroutput on;DECLARE    c_salary customer.salary%TYPE;   c_name customer.name%TYPE;   CURSOR c1(p_salary decimal default 3000) is   select name,salary from customer where salary >= p_salary;BEGIN  --open c1(p_salary=>5000);  open c1(5000);   loop  fetch c1 into c_name,c_salary;  exit when c1%notfound ;   dbms_output.put_line(c_name||‘ ‘||c_salary);  end loop;  close c1;END;
View Code

 

這篇就先看到基礎的東西,遊標知識還是比較多,後面再更新。 

這篇文檔比較深入,供參考

http://www.codeproject.com/Articles/580628/OracleplusPL-fSQLplusCursor

oracle遊標(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.