plsql程式設計詳解 二

2021-07-31 05:25:20 字數 4438 閱讀 3507

九:迴圈語句

一共有三種迴圈方式

oracle中沒有自增++ ;

自身=自身+1即可

while 條件 loop … end loop;

loop exit when 條件 … end loop;

for i in 1..5 (必須為連續區間)loop … ;end loop;

例1:

--while迴圈列印數字的1~10
set serveroutput on

declare

--定義迴圈變數
pnum number := 1;

begin

while pnum <=10 loop

--迴圈體

dbms_output.put_line(pnum);

--使該變數+1

pnum := pnum+1;

end loop;

end;

/例2:

--loop迴圈列印數字的1~10(推薦)

set srveroutput on

declare

--定義迴圈變數

pnum number:=1;

begin

loop

--退出條件

exit when pnum>0;

--列印該變數的值

dbms_output.put_line(pnum);

--迴圈變數+1

pnum:=pnum+1;

end loop;

end;

/

例3:

--for迴圈列印數字1~10

set serveroutput on

declare

--定義迴圈變數

pnum number:=1;

begin

for pnum in 1..10 loop --表示從1到10連續的區間

--迴圈體

dbms_output.put_line(pnum);

end loop;

end;

/

三種迴圈,建議使用第二種迴圈,因為第二種在控制游標的時候會比較方便

十:游標

游標(游標):就是乙個結果集(result set)

不能把乙個集合賦值給乙個基本型變數

游標的語法:

cursor 游標名[(引數名 資料型別[,引數名 資料型別]…)] is select 語句;

例:cursor c1 select ename from emp;

開啟游標:open c1;

注:就是執行select語句,將結果集給c1

關閉游標:close c1;

取出一行游標的值:fetch c1 into pename;(取一行到變數中)

fetch 的作用:1)把當前指標指向的記錄返回

2)將指標指向下一條記錄

游標屬性:%found %notfound 值有true與false

例:

--查詢並列印員工的姓名薪水

set serveroutput on

declare

--定義游標

cursor cemp is select ename, sal from emp;

--使用引用型變數,為游標定義對應的變數

pename emp.ename%type;

psal emp.sal%type;

begin

--開啟游標

open cemp;

loop

fetch cemp into pename, psal; --取一條記錄

exit when cemp%notfound; --沒有取到記錄退出。

dbms_output.put_line(pename || '的薪水是' || psal);

end loop;

--關閉游標

close cemp;

end;

/

十一:練習

--給員工漲工資,總裁1000,經理800,其他400

set serveroutput on

declare

cursor cemp is select empno,ename,empjob,sal from emp;

pempno emp.empno%type;

pempjob emp.empjob%type;

psal emp.sal%type;

pename emp.ename%type;

begin

--把之前漲的工資回退回去

rollback;

open cemp;

loop

--取出乙個員工

fetch cemp into pempno,pename,pempjob,psal;

exit when cemp%notfound;

--判斷是什麼職位

if pempjob = 'president' then update emp set sal=sal+1000 where empno=pempno;

elsif pempjob = 'manager' then update emp set sal=sal+800 where empno=pempno;

else update emp set sal=sal+400 where empno=pempno;

end if;

end loop;

close cemp;

--對於oracle預設的事務隔離級別是read committed

--事務的acid即原子性、一致性、隔離性、永續性

commit;

dbms_output.put_line('修改完成');

open cemp;

loop

fetch cemp into pempno,pename,pempjob,psal;

exit when cemp%notfound;

dbms_output.put_line(pename||'的薪水是'||psal);

end loop;

close cemp;

end;

/

十二:游標的屬性與限制

1游標的屬性

%found %notfound

%isopen : 判斷游標是否開啟

%rowcount : 影響的行數

2.游標數的限制:預設情況下,oracle資料庫只允許在同乙個會話中,開啟300個游標

>--切換到管理員,檢視資料庫初始化設定   

>show user

>conn sys/[email protected]:1521/orcl as sysdba

>show parameter cursor

修改游標數的限制:

alter system set open_cursors=400 scope=both;

scope是範圍的意思,它的取值有:both(兩個同時更改),memory(只更改當前例項,不更改引數檔案),spfile(只更改引數檔案,不更改當前檔案,資料庫需要重啟)

if cemp%isopen then

dbms_output.put_line('游標已經開啟');

end if;

loop

--取出一條記錄

fetch cemp into pempno,pjob;

exit when cemp%notfound;

--列印rowcount的值

dbms_output.put_line('rowcount'||cemp%rowcount);

end loop;

十三:帶引數的游標

(1)游標就是乙個結果集(result set)

(2)游標的語法:

cursor 游標名[(引數名 資料型別[,引數名 資料型別]…)]

is select 語句;

cursor c1 is select ename from emp;

--查詢某個部門中員工的姓名

set serveroutput on

declare

--定義帶引數的游標

cursor cemp(dno number) is select ename from emp where deptno=dno;

begin

open cemp(10);

loop

fetch cemp into penae;

exit when cemp%notfound;

dbms_output.put_line(pename);

end loop;

close cemp;

end;

/

PL SQL 程式設計 二

1 for迴圈 語法 begin for i in reverse 1.10 loop insert into users values i,歐巴馬 end loop end 注意 迴圈變數 i 是隱含增加的,所以無法看到 2 goto語句 goto 語句用於跳轉到特定的位置去執行語句。由於goto...

pl sql程式設計(二)

建立乙個函式 輸入姓名 返回年薪 表裡存的是月薪 create function sp fun2 spname varchar2 return number is yearsal number 10,2 begin select sal 12 into yearsal from emp where ...

PL SQL 程式設計 二

1 for迴圈 語法 begin for i in reverse 1.10 loop insert into users values i,歐巴馬 end loop end 注意 迴圈變數 i 是隱含新增的。所以無法看到 2 goto語句 goto 語句用於跳轉到特定的位置去執行語句。因為goto...