Oracle 遊標使用總結

來源:互聯網
上載者:User

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語句的執行結果決定是否需要插入新記錄。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.