游標(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語句的執行結果決定是否需要插入新記錄。
好文章備忘
1 規範了命名空間 地圖 com.mapabc.maps.api.mflexmap 常量 com.mapabc.maps.api.constants 包括 mdisplaystate m s mdirection mmapmousetools malignposition mlanguage mgp...
IT好書好文章
最近讀了一些好書,好文章。在此記錄一下。程式設計之美 這本書裡講了很多看起來很難的,但是經過仔細分析又能寫出來的程式。讀這本書需要比較深的演算法和程式設計功底。裡面的例子個個都很經典。暫時處於 啃起來很難的狀態 不過還是打算畢業之前認真讀兩遍。程式設計珠璣 這本書講了作者親身經歷的一些程式設計問題,...
Ext的Panel總結(好文章)
我剛才禁不住 去看了一下ext.window的api文件,發現只是比panel多了點什麼最大化 最小化 關閉 置前 置後 動畫引發目標設定 可調整大小這些功能。像什麼標題欄 工具欄之類的東西在ext.panel早就封裝好了。搞定了ext.panel終於可以悶聲發大財羅。哈哈哈。這一文主要總結一下,p...