Oracle PL SQL游標的使用方法

2021-09-30 11:47:36 字數 4411 閱讀 9709

--演示隱式游標,系統自動宣告,自動開啟,自動使用並且自動關閉

begin

update emp set sal = 1000;

dbms_output.put_line('影響的行數:' || sql%rowcount);

end;

rollback;

/*游標的使用方法:

第一步:宣告游標

第二步:開啟游標

第三步:使用游標進行迴圈操作

第四步:關閉游標*/

--普通游標,游標本身就是乙個變數

declare

--下面的這行**宣告了乙個游標

cursor mycur is select * from emp where deptno = 20;

emprow emp%rowtype;

begin

open mycur; --開啟游標

loop

fetch mycur into emprow; --把游標所指的紀錄放到變數中

exit when (mycur%notfound); --當游標沒有指向行時退出迴圈

dbms_output.put_line('名字:' || emprow.ename || '薪水:' || emprow.sal);

end loop;

close mycur; --關閉游標

end;

--簡單游標,列操作

declare

empname emp.ename%type;

empsal emp.sal%type;

cursor mycur is select ename,sal from emp where deptno = 30;

begin

open mycur;

loop

fetch mycur into empname,empsal;

exit when mycur%notfound;

dbms_output.put_line('姓名:' || empname || '工資' || empsal);

end loop;

end;

--簡單游標,列操作

declare

cursor c

isselect * from dept;

vdept_row_record c%rowtype;

begin

open c;

fetch c into vdept_row_record;

dbms_output.put_line(vdept_row_record.dname);

close c;

end;

--when迴圈游標

declare

cursor c

isselect * from dept;

vdept_row_record c%rowtype;

begin

open c;

loop

fetch c into vdept_row_record;

exit when(c%notfound);

dbms_output.put_line(vdept_row_record.dname);

end loop;

close c;

end;

--while迴圈游標

declare

cursor c

isselect * from dept;

vdept_row_record c%rowtype;

begin

open c;

fetch c into vdept_row_record;

while (c%found) loop

dbms_output.put_line(vdept_row_record.dname);

fetch c into vdept_row_record;

end loop;

close c;

end;

--for迴圈游標

declare

cursor c

isselect * from dept;

vdept_row_record c%rowtype;

begin

for vdept_row_record in c loop

dbms_output.put_line(vdept_row_record.dname);

end loop;

end;

--帶參游標

declare

cursor c(ssal emp.sal%type, sempno emp.empno%type)

isselect * from emp where sal >= ssal and empno > sempno;

begin

for record_data in c(2500, 6666) loop

dbms_output.put_line(record_data.ename);

end loop;

end;

--update游標

declare

cursor c(ssal emp2.sal%type)

isselect * from emp2 where sal >= ssal for update;

begin

for record_data in c(2500) loop

if (record_data.sal < 3000) then

update emp2 set sal = sal + 3 where current of c;

dbms_output.put_line(record_data.ename);

elsif (record_data.sal = 5000) then

update emp2 set sal = sal - 3 where current of c;

dbms_output.put_line(record_data.ename);

end if;

end loop;

end;

--引用游標不能使用迴圈游標的語法

--引用游標不能進行刪除和修改

--引用游標是乙個資料型別,使用該型別必須宣告變數

--弱型別引用游標,就是不指定游標將要提取的資料行的型別

declare

type my_cur_type is ref cursor;

mycur my_cur_type;--宣告變數

which varchar2(10);

deptrow dept%rowtype;

emprow emp%rowtype;

begin

which := '&請選擇dept還是emp';

if (which = 'dept') then

open mycur for select * from dept;

loop

fetch mycur into deptrow;

exit when (mycur%notfound);

dbms_output.put_line(deptrow.deptno || ' ' || deptrow.dname);

end loop;

elsif (which = 'emp') then

open mycur for select * from emp;

loop

fetch mycur into emprow;

exit when (mycur%notfound);

dbms_output.put_line(emprow.empno || ' ' || emprow.ename);

end loop;

end if;

close mycur;

end;

--強型別引用游標,就是指定游標將要提取的資料行的型別 ,只能是record或%rowtype型別

--比如:return number是錯的,return emp.ename%type也是錯的

declare

type mycurtype is ref cursor return emp%rowtype;

mycur mycurtype;--宣告變數

emprow emp%rowtype;

begin

open mycur for select * from emp;

loop

fetch mycur into emprow;

exit when mycur%notfound;

dbms_output.put_line(emprow.empno || ' ' || emprow.ename);

end loop;

close mycur;

end;

Oracle PL SQL游標的學習

一 游標是什麼 游標字面理解就是游動的游標。用資料庫語言來描述 游標是對映在結果集中一行資料上的位置實體,有了游標,使用者就可以訪問結果集中的任意一行資料了,將游標放置到某行後,即可對該行資料進行操作,例如提取當前行的資料等。二 游標的分類 顯式游標和隱式游標 顯式游標的使用需要4步 1.宣告游標 ...

Oracle PL SQL游標的引入

一 定義 游標,也叫游標,就是乙個結果集 result set 二 語法 cursor 游標名 引數名 資料型別 引數名 資料型別 is select 語句 三 游標用法 1 定義游標 cursor c1 is select ename from emp 2 開啟游標執行查詢 open c1 3 取...

ORACLE PL SQL 基礎2 游標的學習

游標學習 一 游標是什麼 游標字面理解就是游動的游標。用資料庫語言來描述 游標是對映在結果集中一行資料上的位置實體,有了游標 使用者就可以訪問結果集中的任意一行資料了,將游標放置到某行後,即可對該行資料進行操作,例如提取當前 行的資料等等。二 游標的分類 顯式游標和隱式游標 顯示游標的使用需要4步 ...