ORACLE遊標學習
阿新 • • 發佈:2018-12-30
方式一:
set serverout on;
//這裡定義的遊標cu_emp可以理解為一個數組一樣的東西
declare cursor cu_emp is select empno,ename,sal from emp;
e_no number;
e_name varchar2(10);
e_sal number;
begin
//開啟遊標
open cu_emp;
//相當於遍歷,把每一行的資料傳給自定義的變數
fetch cu_emp into e_no,e_name,e_sal;
//found如果資料存在的話輸出
while cu_emp%found loop
dbms_output.put_line('編號:'||e_no||',姓名'||e_name||',基本薪資'||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
close cu_emp;
end;
輸出: 編號:9000,姓名sb,基本薪資 編號:7369,姓名SMITH,基本薪資800 編號:7499,姓名ALLEN,基本薪資1600 編號:7521,姓名WARD,基本薪資1250 編號:7566,姓名JONES,基本薪資2975 編號:7654,姓名MARTIN,基本薪資1250 編號:7698,姓名BLAKE,基本薪資2850 編號:7782,姓名CLARK,基本薪資2450 編號:7788,姓名SCOTT,基本薪資3000 編號:7839,姓名KING,基本薪資5000 編號:7844,姓名TURNER,基本薪資1500 編號:7876,姓名ADAMS,基本薪資1100 編號:7900,姓名JAMES,基本薪資950 編號:7902,姓名FORD,基本薪資3000 編號:7934,姓名MILLER,基本薪資1300
方式二:(動態指定自定變數型別)
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no emp.empno%type;
e_name emp.ename%type;
e_sal emp.sal%type;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
while cu_emp%found loop
dbms_output.put_line('編號:'||e_no||',姓名'||e_name||',基本薪資' ||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
close cu_emp;
end;
//輸出結果和上面的一樣就不貼出來了
方式三:(定義一個一行的變數e emp%rowtype;)
set serverout on;
declare cursor cu_emp is select * from emp;
e emp%rowtype;
begin
open cu_emp;
fetch cu_emp into e;
while cu_emp%found loop
dbms_output.put_line('編號:'||e.empno||',姓名'||e.ename||',基本薪資'||e.sal);
fetch cu_emp into e;
end loop;
close cu_emp;
end;
方式四:(隱式遊標學習)
begin
if sql%isopen then
dbms_output.put_line('遊標已開啟');
else
dbms_output.put_line('遊標未開啟');
end if;
end;
SQL> declare e_count number;
2 begin
3 select count(*) into e_count from emp;
4 dbms_output.put_line('遊標捕獲記錄數'||sql%rowcount);
5 end;
6 /
遊標捕獲記錄數1
方式五:(動態遊標)
SQL> declare type customType is ref cursor;
2 e_count number;
3 e emp%rowtype;
4 s salgrade%Rowtype;
5 cType customType;
6 begin
7 select count(*) into e_count from emp where job='PRESIDENT';
8 if e_count=0 then
9 open cType for select * from salgrade;
10 fetch cType into s;
11 while cType%found loop
12 dbms_output.put_line('等級:'||s.grade||',最低薪資'||s.losal||',最高薪資'||s.hisal);
13 fetch cType into s;
14 end loop;
15 close cType;
16 else
17 open cType for select * from emp where job='PRESIDENT';
18 fetch cType into e;
19 while cType%found loop
20 dbms_output.put_line('編號:'||e.empno||',姓名'||e.ename||',基本薪資'||e.sal);
21 fetch cType into e;
22 end loop;
23 close cType;
24 end if;
25 end;
26 /
編號:7839,姓名KING,基本薪資5000
PL/SQL procedure successfully completed
SQL> declare type customType is ref cursor;
2 e_count number;
3 e emp%rowtype;
4 s salgrade%Rowtype;
5 cType customType;
6 begin
7 select count(*) into e_count from emp where job='PRESIDENT1';
8 if e_count=0 then
9 open cType for select * from salgrade;
10 fetch cType into s;
11 while cType%found loop
12 dbms_output.put_line('等級:'||s.grade||',最低薪資'||s.losal||',最高薪資'||s.hisal);
13 fetch cType into s;
14 end loop;
15 close cType;
16 else
17 open cType for select * from emp where job='PRESIDENT';
18 fetch cType into e;
19 while cType%found loop
20 dbms_output.put_line('編號:'||e.empno||',姓名'||e.ename||',基本薪資'||e.sal);
21 fetch cType into e;
22 end loop;
23 close cType;
24 end if;
25 end;
26 /
等級:1,最低薪資700,最高薪資1200
等級:2,最低薪資1201,最高薪資1400
等級:3,最低薪資1401,最高薪資2000
等級:4,最低薪資2001,最高薪資3000
等級:5,最低薪資3001,最高薪資9999
PL/SQL procedure successfully completed
附:
1、
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no number;
e_name varchar2(10);
e_sal number;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
while cu_emp%found loop
dbms_output.put_line('編號:'||e_no||',姓名'||e_name||',基本薪資'||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
close cu_emp;
end;
2、
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no emp.empno%type;
e_name emp.ename%type;
e_sal emp.sal%type;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
while cu_emp%found loop
dbms_output.put_line('編號:'||e_no||',姓名'||e_name||',基本薪資'||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
close cu_emp;
end;
3、
set serverout on;
declare cursor cu_emp is select * from emp;
e emp%rowtype;
begin
open cu_emp;
fetch cu_emp into e;
while cu_emp%found loop
dbms_output.put_line('編號:'||e.empno||',姓名'||e.ename||',基本薪資'||e.sal);
fetch cu_emp into e;
end loop;
close cu_emp;
end;
4、
begin
if sql%isopen then
dbms_output.put_line('遊標已開啟');
else
dbms_output.put_line('遊標未開啟');
end if;
end;
declare e_count number;
begin
select count(*) into e_count from emp;
dbms_output.put_line('遊標捕獲記錄數'||sql%rowcount);
end;
5、
declare type customType is ref cursor;
e_count number;
e emp%rowtype;
s salgrade%Rowtype;
cType customType;
begin
select count(*) into e_count from emp where job='PRESIDENT1';
if e_count=0 then
open cType for select * from salgrade;
fetch cType into s;
while cType%found loop
dbms_output.put_line('等級:'||s.grade||',最低薪資'||s.losal||',最高薪資'||s.hisal);
fetch cType into s;
end loop;
close cType;
else
open cType for select * from emp where job='PRESIDENT';
fetch cType into e;
while cType%found loop
dbms_output.put_line('編號:'||e.empno||',姓名'||e.ename||',基本薪資'||e.sal);
fetch cType into e;
end loop;
close cType;
end if;
end;