Oracle游標使用方法( 游標裡使用變數繫結)

2021-05-24 08:45:28 字數 4411 閱讀 1778

游標(cursor)也叫游標,在關聯式資料庫中經常使用,在pl/sql程式中可以用cursor與select一起對錶或者檢視中的資料進行查詢並逐行讀取。

oracle游標分為顯示游標和隱式游標。

顯示游標(explicit cursor):在pl/sql程式中定義的、用於查詢的游標稱作顯示游標。

隱式游標(implicit cursor):是指非pl/sql程式中定義的、而且是在pl/sql中使用update/delete語句時,oracle系統自動分配的游標。

一.顯示游標

1.使用步驟

(1)定義 (2)開啟 (3)使用 (4)關閉

2.使用演示

首先建立測試用表student,指令碼如下:

create table "student" (

"stuname" varchar2(10 byte),

"stuno" varchar2(4 byte),

"age" number,

"gender" varchar2(2 char) )

(1).使用while迴圈處理游標

create or replace procedure proc_stu1 as

begin

--顯示游標使用,使用while迴圈

declare

--1.定義游標,名稱為cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

--定義變數,存放游標取出的資料

v_stuno varchar(4);

v_stuname varchar(20);

begin

--2.開啟游標cur_stu

open cur_stu;

--3.將游標的當前行取出存放到變數中

fetch cur_stu into v_stuno,v_stuname;

while cur_stu%found --游標所指還有資料行,則繼續迴圈

loop

--列印結果

dbms_output.put_line(v_stuno||'->'||v_stuname);

--繼續將游標所指的當前行取出放到變數中

fetch cur_stu into v_stuno,v_stuname;

end loop;

close cur_stu; --4.關閉游標

end;

end proc_stu1;

(2).使用if..else代替while迴圈處理游標

create or replace procedure proc_stu2 as

begin

--顯示游標使用,使用if判斷

declare

--1.定義游標,名稱為cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

--定義變數,存放游標取出的資料

v_stuno varchar(4);

v_stuname varchar(20);

begin

--2.開啟游標cur_stu

open cur_stu;

--3.將游標的當前行取出存放到變數中

fetch cur_stu into v_stuno,v_stuname;

loop

if cur_stu%found then --如果游標cur_stu所指還有資料行

--列印結果

dbms_output.put_line(v_stuno||'->'||v_stuname);

--繼續將游標所指的當前行取出放到變數中

fetch cur_stu into v_stuno,v_stuname;

else

exit;

end if;

end loop;

close cur_stu; --4.關閉游標

end;

end proc_stu2;

(3).使用for迴圈處理游標

create or replace procedure proc_stu3 as

begin

--顯示游標使用,使用for迴圈

declare

--定義游標,名稱為cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

begin

for stu in cur_stu

loop

dbms_output.put_line(stu.stuno||'->'||stu.stuname);

--迴圈做隱含檢查 %notfound

end loop;

--自動關閉游標

end;

end proc_stu3;

(4).常用的使用exit when處理游標

create or replace

procedure proc_stu1_1 as

begin

--顯示游標使用,使用exit when迴圈

declare

--1.定義游標,名稱為cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

--定義變數,存放游標取出的資料

v_stuno varchar(4);

v_stuname varchar(20);

begin

--2.開啟游標cur_stu

open cur_stu;

loop

--3.將游標的當前行取出存放到變數中

fetch cur_stu into v_stuno,v_stuname;

exit when cur_stu%notfound; --游標所指還有資料行,則繼續迴圈

--列印結果

dbms_output.put_line(v_stuno||'->'||v_stuname);

end loop;

close cur_stu; --4.關閉游標

end;

end proc_stu1_1;

二.隱式游標

1.使用演示

create or replace procedure proc_stu4 as

begin

--隱式游標使用

update student set stuname='張燕廣' where stuno='1104';

--如果更新沒有匹配則插入一條新記錄

if sql%notfound then

insert into student(stuno,stuname,age,gender)

values('1104','張燕廣',18,'男');

end if;

end proc_stu4;

2.說明

所有的sql語句在上下文區內部都是可執行的,因為都有乙個游標指向上下文區,此游標就是sql游標,與現實游標不同的是,sql游標在pl/sql中不需要開啟和關閉,而是在執行update、 delete是自動開啟和關閉。

上面例子中就是通過sql%notfound游標屬性判斷update語句的執行結果決定是否需要插入新記錄。

游標裡面如何使用變數繫結?

示例如下:

declare

type rc is ref cursor;

l_rc rc;

l_dummy all_objects.object_name%type;

l_start number default dbms_utility.get_time;

begin

for i in 1 .. 1000

loop

open l_rc for

'select object_name

from all_objects

where object_id = :x'

using i;

fetch l_rc into l_dummy;

close l_rc;

end loop;

dbms_output.put_line

( round( (dbms_utility.get_time-l_start)/100, 2 ) ||

' seconds...' );

end;

游標使用方法

游標使用方法 use db1 declare my cursor cursor scroll dynamic scroll表示可隨意移動游標指標 否則只能向前 dynamic表示可以讀寫游標 否則游標唯讀 forselect 姓名 from 個人資料 open my cursor declare n...

ORACLE中游標的使用方法

游標被用的最多的是在儲存過程中執行批量修改或是批量刪除操作,比如刪除一條主表記錄之後,可以執行乙個儲存過程刪除該記錄對應的明細記錄。或者修改某張表的某個資料後反寫另一張表的資料。這在erp軟體開發中是經常用到的,例如出庫單實提之後要反寫合同上的實提重量等等,這也要靠好的資料庫設計來支援。下面是乙個o...

Sql 事物 游標 使用方法

當兩個或兩以上的操作要麼都執行,要麼都不執行時要用事務。1.sql寫法 事物 游標 開始事務 begin tran 不顯示計數資訊 set nocount on declare projno varchar 50 cusno varchar 50 宣告游標 declare crmpscontact ...