--演示隱式游標,系統自動宣告,自動開啟,自動使用並且自動關閉
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步 ...