1. 程式人生 > >Oracle遊標的使用例項

Oracle遊標的使用例項

遊標就是移動的游標,可以用來逐條或批量的處理資料。當遊標移動到某行時,即可對該行資料進行操作,如提取資料等。

遊標有一下四個屬性,即這四個屬性僅可被用於遊標上:%isopen判斷遊標是否被開啟,值為true或false;%found和%notfound判斷遊標所在行是否有效,一般沒有資料了既是無效,值也是true或false;%rowcount返回的是當前位置為止遊標讀取的記錄行數。

比如我有一個users表,儲存使用者名稱和密碼等資訊,現在我想用遊標對資料進行遍歷處理,我就可以這樣寫:

declare 
v_username users.username%type;
v_password users.password%type;
cursor c is select t.username,t.password from users t;
begin
  open c;
  loop
  fetch c into v_username,v_password;
  exit when c%notfound;
  dbms_output.put_line('使用者'||v_username||'的密碼是'||v_password);
  end loop;
  dbms_output.put_line('一共有'||c%rowcount||'條記錄');
  close c;
end;

第二三行定義變數,用於獲得遊標當前位置的資料,為了防止資料型別不一致,可以用“表名.列名%type”的形式獲取到合適的資料型別,即如果表users中列username的資料型別是varchar的話,那麼v_username的資料型別也是varchar。後面還會給出另一種獲得資料型別的方式。

第四行就是定義遊標了,注意不能把值直接賦給遊標,也不能在表示式中使用遊標。is後面是遊標的定義,是一個查詢語句,表明了遊標在這個操作時,會發生作用,逐條指向這個操作產生的資料。

從第五行開始就是程式主體。首先我們需要開啟遊標,不開啟遊標將會得到錯誤提示。接著迴圈處理,將每次遊標提取到的資料放入變數中(第八行)。

第九行是一個退出的判斷,即當遊標查詢不到資料時,退出迴圈。

第十行是輸出語句,輸出迴圈的結果。

第十二行利用遊標屬性%rowcount統計了記錄總數。

結束時要關閉遊標。

程式執行結果如圖:


如果你覺得逐條處理過於繁瑣,遊標也提供了批量處理資料的方式,利用bulk collect:

declare
type username_type is table of users.username%type;
type password_type is table of users.password%type;
v_username username_type;
v_password password_type;
cursor c is select t.username,t.password from users t;
begin
  open c;
  fetch c
  bulk collect into v_username,v_password;
  ......
  close c;
end;

這裡給出了另一種獲取資料型別的方式,先定義type型別username_type來接收資料型別,接著將其賦給變數v_username。

在使用bulk collect時,直接在fetch c後面加入bulk collect,則這時變數v_username和v_password中儲存的是所有資料的集合,因此不能向上面那樣使用dbms_output.put_line將其輸出。

如果你經常使用遊標,會發現頻繁地寫open、fetch、close會顯得很麻煩,因此我們可以用一個遊標for迴圈來簡化操作及程式碼。上面的遊標操作可以寫為:

declare
cursor c is select t.username,t.password from users t;
begin
  for c_rec in c loop
    dbms_output.put_line('使用者'||c_rec.username||'的密碼是'||c_rec.password);
    dbms_output.put_line('一共有'||c%rowcount||'條記錄');
  end loop;  
end;

這時我們不必再定義變數來儲存遊標處理的資料了,且也不必再開啟或關閉遊標了,因為for迴圈一開始,遊標便被開啟,結束迴圈,遊標則自動關閉。值得注意的是,這裡有一個隱式宣告的記錄c_rec,它的每一個域都儲存來自遊標c中取出的值。因此我們就可以利用它來找到遊標獲取的使用者名稱和密碼。另外這個c_rec不是遊標,因此不能用它來統計記錄數,即不可以寫c_rec%rowcount,這是錯誤的。

操作結果如圖:


更加簡潔地,你可以用子查詢來代替遊標:

declare
begin
  for c_rec in (select t.username,t.password from users t) loop
    dbms_output.put_line('使用者'||c_rec.username||'的密碼是'||c_rec.password);
  end loop;  
end;

但是這樣用%rowcount統計記錄數就變得十分麻煩。因此我們可以換個思路,我們定義一個變數,讓其在for迴圈中,每執行一次便+1,這樣我們就能統計出記錄數了。這就是在for迴圈中使用引數。同樣,我們也可以在遊標中使用引數,傳遞一些我們暫時不能確定的值:
declare
v_name users.username%type;
v_record number:=0;
begin
  select '123qwe' into v_name from dual;
  for c_rec in (select t.username,t.password from users t where t.username=v_name) loop
    v_record:=v_record+1;
    dbms_output.put_line('使用者'||c_rec.username||'的密碼是'||c_rec.password);
    dbms_output.put_line('一共有'||to_char(v_record)||'條記錄');
  end loop;  
end;

上面的程式是為了找出使用者名稱為“123qwe”的使用者,我們將這個值賦給v_name,然後傳遞給遊標(即那個子查詢)。for迴圈中的引數我們也可以在前面定義好,後面拿來直接使用(這個v_record是需要初始化的,即需要賦初始值,如果你寫成v_record number;,那麼在下面的操作中這個v_record始終是空的,你可以自己試試)。

執行結果如圖:


很好地完成了統計記錄的操作。

我們可以用遊標寫出很複雜的操作,比如處理某些員工的工資等,在loop中寫合適的程式體即可。

下一章我會介紹遊標變數。遊標是靜態的,遊標變數是動態的,它們之間的區別就像常量和變數一樣。下回再說。

相關推薦

Oracle遊標的使用例項

遊標就是移動的游標,可以用來逐條或批量的處理資料。當遊標移動到某行時,即可對該行資料進行操作,如提取資料等。 遊標有一下四個屬性,即這四個屬性僅可被用於遊標上:%isopen判斷遊標是否被開啟,值為true或false;%found和%notfound判斷遊標所在行是否有效

Oracle遊標

begin 隱式 open put 定義 delete declare ora update 遊標分顯示遊標跟隱式遊標,它們都具有%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT四個屬性。 %FOUND:如果SQL語句至少影響到一行數據,則該屬性為tr

oracle遊標的使用(二)

copy str 創建 data- sel 字段 開封 tex 歷史 逐行處理查詢結果,以編程的方式訪問數據 遊標的類型: 1、隱式遊標:在 PL/SQL 程序中執行DML SQL 語句時自動創建隱式遊標,名字固定叫sql。 2、顯式遊標:顯式遊標用於處理返回多行的

mysql和Oracle 遊標的使用

mysql和oracle 遊標的使用使用遊標根據一個表中的數據,循環創建不同的表mysql中的DELIMITER $$DROP PROCEDURE IF EXISTS zy.jk_jkzl_political_location_pro $$CREATE PROCEDURE zy.jk_jkzl_politi

[轉載]Oracle 遊標使用全解

case sys too 結果 nvarchar 指定 信息 ima ren 這個文檔幾乎包含了oracle遊標使用的方方面面,全部通過了測試 -- 聲明遊標;CURSOR cursor_name IS select_statement--For 循環遊標--(1)定義

Oracle遊標/異常/過程/函數

bst body enter erro 備註 iso 位移 回調 log 1、基礎語法 http://692088846.iteye.com/blog/2017137 (%type、%rowtype、if\if else\if elseif else、while、do

oracle 遊標

fetch turn pen otf select set not 弱類型 單行 1.自定義(顯式)遊標 set serverout on;declare cursor cu_emp is select empno,ename,sal from emp;e_no numbe

Oracle遊標 CURSOR實例詳解

www 取值 alt 內存 sel www. 輸出 lose info 作者:gqk 遊標 CURSOR: 一、遊標概述: 遊標(cursor)是數據庫系統在內存中開設的一個數據緩沖區,存放SQL語句的執行結果。 每個遊標都有一個名字,用戶可以用SQL語句逐一從遊標中

檢視Oracle資料庫例項啟動狀態

SQL> conn / as sysdba 已連線到空閒例程。 SQL> startup nomount ORACLE 例程已經啟動。 Total System Global Area 534462464 bytes Fixed Size 21

分享知識-快樂自己: Oracle資料庫例項、使用者、表、表空間之間關係

資料庫:   Oracle資料庫是資料的物理儲存。這就包括(資料檔案ORA或者DBF、控制檔案、聯機日誌、引數檔案)。   其實Oracle資料庫的概念和其它資料庫不一樣,這裡的資料庫是一個作業系統只有一個庫。可以看作是Oracle就只有一個大資料庫。 例項:   一個Oracle例項(Oracle

Oracle 遊標的各種寫法

-- for .. in `隱式遊標` BEGIN FOR RS IN (SELECT column_1 FROM table_name) LOOP dbms_output.put_line(RS.column_1); END LOOP; END; -- RS 必須是單個欄位 DECLARE

Oracle 遊標實現學生學號自動生成

每個學生都有唯一專屬的學號,現有學號格式為ABCDEFGHIJ共10位數字,其中AB表示學院編號;CD表示專業編號;EF表示年級;GH表示班級編號;IJ表示學生序號。 已知:2018年開學之際,已知每個專業的總人數和需要分配的班級數,請為每位同學分配唯一的學號。 要求:每個專業的班級序號

JDBC連線Oracle資料庫例項

本文給出一個通過JDBC連線Oracle資料庫的例項,希望對JDBC初學者有所幫助。我沒有像很多例子那樣一個函式就把整個JDBC的操作全部完成,這樣的程式碼在企業專案開發中一般是不能通過稽核的,我現在工作的公司就對程式碼規範有嚴格要求。比如,“一個函式,只做一件事”。這意味著你不能把一大堆功能程式碼

mybatis框架oracle使用例項

1.ORACLE連線客戶端使用pl/sql,在連線oracle前要先配置oci.dll==>instantclient,可以到官網去下載相對應版本,如32位或者64位. 2.連線成功後輸入賬號密碼,連線使用與其它資料庫都大同小異. 3.分頁語句在mysql上用的limit,但是在o

Transact-SQL的遊標例項

print '------------- Authors report ---------------' print '' --定義authors表的遊標 declare author_cursor

oracle遊標一 靜態遊標-顯示遊標-宣告&初始化

oracle靜態遊標-顯示遊標的使用 目錄: 1. 遊標語法 2. 遊標的使用 2.1 宣告遊標並初始化 2.2 宣告多個變數接收遊標返回值 2.3 宣告一個record變數接收遊標返回值 2.4 開啟/關閉遊標 2.5 獲取遊標中的值 2.6 重複

mysql 遊標例項

遊標(Cursor)是處理資料的一種方法,為了檢視或者處理結果集中的資料,遊標提供了在結果集中一次一行或者多行前進或向後瀏覽資料的能力。可以把遊標當作一個指標,它可以指定結果中的任何位置,然後允許使用者對指定位置的資料進行處理。 --declare --open --fetch --

Oracle觸發器例項

# 觸發器 create or replace trigger tr_tmp before insert on emp for each row begin select empno_seq.nextval   into :new.empno from dual; end insert into

Oracle-遊標迴圈插入資料

遇到一個需求統計歷史每個月底的資料插入到表中,查詢了資料發現使用遊標會很方便,記錄一下解決思路 先查出每個月月底的日期作為條件 select to_char(lastday, 'yyyy-mm-dd') lastday from (select last

Oracle 遊標遍歷 顯式遊標 靜態遊標 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

-- Created on 2018/11/6 by YXQ  --顯示遊標 & 靜態遊標的處理 declare      --定義(遊標一個可以遍歷的結果集)      --宣告cursor,建立和命名一個sql工作