PL/SQL 03 流程控制
--IF語法
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
--CASE 語法
1、在 CASE 語句中使用單一選擇符進行等值比較
CASE selector
WHEN expression1 THEN sequence_of_statements1;
WHEN expression2 THEN sequence_of_statements2;
...
WHEN expressionN THEN sequence_of_statementsN;
[ELSE sequence_of_statementsN+1;]
END CASE;
2、在 CASE 語句中使用多種條件比較
CASE
WHEN search_condition1 THEN sequence_of_statements1;
WHEN search_condition2 THEN sequence_of_statements2;
...
WHEN search_conditionN THEN sequence_of_statementsN;
[ELSE sequence_of_statementsN+1;]
END CASE;
--迴圈
1、基本迴圈 LOOP
LOOP
statement1;
...
EXIT [WHEN condition];
END LOOP;
2、WHILE 迴圈
WHILE condition LOOP
statement1;
statement2;
...
END LOOP;
3、FOR 迴圈
FOR counter in [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
...
END LOOP;
4、巢狀迴圈和標號
巢狀迴圈是指在一個迴圈語句之中嵌入另一個迴圈語句,而標號(Label)則用於標記巢狀塊或巢狀迴圈。通過在巢狀迴圈中使用標號,可以區分內層迴圈和外層迴圈,並且可以在內層迴圈中直接退出外層迴圈。在編寫 PL/SQL 塊時,可以使用<
declare
result int;
begin
<
for i in 1..100 loop
<
for j in 1..100 loop
result:=i*j;
exit outer when result=1000;
exit when result=500;
end loop inner;
dbms_output.put_line(result);
end loop outer;
dbms_output.put_line(result);
end;
/
如上所示,當執行 PL/SQL 塊時,如果 result=1000,那麼會直接退出外層迴圈,而當 result=500 時只會退出內層迴圈。
--順序控制語句 GOTO 、NULL
PL/SQL 不僅提供了條件分支語句和迴圈控制語句,而且還提供了順序控制語句 GOTO 和 NULL。但與 IF,CASE 和 LOOP 語句不同,GOTO 語句和 NULL 語句,一般情況下不要用。
1、GOTO
GOTO 語句用於跳轉到特定標號處去執行語句。注意,以為使用 GOTO 語句會增加程式的複雜性,並且使得應用程式可讀性差,所以開發應用程式時,一般都建議使用者不要使用 GOTO 語句。
其語法如下:
GOTO label_name;
其中,label_name 是已經定義的標號名。注意,當使用 GOTO 跳轉到特定標號時,標號後至少要包含一條可執行語句。示例如下:
declare
i int:=1;
begin
loop
insert into temp values(i);
if i=10 then
goto end_loop;
end if;
i:=i+1;
end loop;
<
dbms_output.put_line('迴圈結束');
end;
/
如上所示,在執行以上 PL/SQL 塊時,如果 i=10,則會跳轉到標號 end_loop,並執行隨後的語句。
2、NULL
NULL語句不會執行任何操作,並且會直接將控制傳遞到下一條語句。使用 NULL 語句的主要好處是可以提高 PL/SQL 程式的可讀性,示例如下:
declare
v_sal emp.sal%type;
v_ename emp.ename%type;
begin
select ename,sal into v_ename,v_sal from emp where empno='&no';
if v_sal<3000 then
update emp set comm=sal*0.1 where ename=v_ename;
else
null;
end if;
end;
/
當執行以上 PL/SQL 塊時,會根據輸入的僱員號確定僱員名及其工資;如果僱員工資低於3000,則將其補助設定為工資的10%;如果僱員的工資高於3000,則不會執行任何操作(NULL)。
--示例
declare
cj xkb.chengji%type;
state varchar2(4);
begin
select chengji into cj from xkb
where stuid=101 and kcid=1001;
if cj between 90 and 100 then --if語句
state:='優秀';
elsif cj between 70 and 89 then
state:='良好';
elsif cj between 60 and 69 then
state:='及格';
else
state:='差';
end if;
dbms_output.put_line('分數是:'||cj);
dbms_output.put_line('等級是:'||state);
end;
select stuname,sex,
case sex --case 值的比較
when 'm' then '男'
when 'f' then '女'
else '預設值'
end "性別"
from stu
IKKI@ test10g> declare
2 v_deptno emp.deptno%type;
3 begin
4 v_deptno:='&no';
5 case v_deptno
6 when 10 then
7 update emp set comm=100 where deptno=v_deptno;
8 when 20 then
9 update emp set comm=80 where deptno=v_deptno;
10 when 30 then
11 update emp set comm=50 where deptno=v_deptno;
12 else
13 dbms_output.put_line('not found');
14 end case;
15 end;
16 /
Enter value for no: 10
old 4: v_deptno:='&no';
new 4: v_deptno:='10';
PL/SQL procedure successfully completed.
select stuname,sex, --decode 值的比較(不能條件判斷)
decode(sex,
'm','男',
'f','女',
'預設值') "性別"
from stu
select stuid,kcid,
case --case 條件判斷
when chengji between 90 and 100 then '優秀'
when chengji between 70 and 89 then '良好'
when chengji between 60 and 69 then '及格'
else '差'
end state
from xkb
IKKI@ test10g> declare
2 v_sal emp.sal%type;
3 v_ename emp.ename%type;
4 begin
5 select ename,sal into v_ename,v_sal
6 from emp where empno='&no';
7 case
8 when v_sal<1000 then
9 update emp set comm=100 where ename=v_ename;
10 when v_sal<2000 then
11 update emp set comm=80 where ename=v_ename;
12 when v_sal<6000 then
13 update emp set comm=50 where ename=v_ename;
14 end case;
15 end;
16 /
Enter value for no: 7788
old 6: from emp where empno='&no';
new 6: from emp where empno='7788';
PL/SQL procedure successfully completed.
declare
m int:=0;
n int:=1;
begin
loop --loop迴圈
m:=m+n;
n:=n+1;
exit when n=101;
end loop;
dbms_output.put_line('m is :'||m);
end;
declare
m int:=0;
n int:=1;
begin
while n<=100 --while迴圈
loop
m:=m+n;
n:=n+1;
end loop;
dbms_output.put_line('m is :'||m);
end;
declare
m int:=0;
n int;
begin
for n in 1..100 --for迴圈
loop
m:=m+n;
end loop;
dbms_output.put_line('m is :'||m);
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27633655/viewspace-1080386/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pl/sql 版本控制工具SQL
- day03 流程控制
- PL/SQL 條件控制語句SQL
- PL/SQL迴圈控制語句SQL
- 實現PL/SQL的版本控制-SVNSQL
- 關於pl/sql中流程控制和迴圈的一些總結SQL
- Oracle:PL/SQL--開啟控制檯or關閉控制檯OracleSQL
- SQL SERVER 流程控制語句SQLServer
- PL/SQLSQL
- PLSQL Language Referenc-PL/SQL控制語句-順序控制語句-NULLSQLNull
- Sql Server系列:流程控制語句SQLServer
- SQL&PL/SQL (轉)SQL
- PL/SQL 宣告SQL
- PL/SQL cursorSQL
- PL/SQL打包SQL
- PL/SQL DEVSQLdev
- Oracle PL/SQLOracleSQL
- PLSQL Language Referenc-PL/SQL靜態SQL-事務處理和控制SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-自治事務-控制自治事務SQL
- 使用PL/Scope分析PL/SQL程式碼SQL
- PLSQL Language Reference-PL/SQL概覽-PL/SQL架構SQL架構
- [PL/SQL]10g PL/SQL學習筆記(一)SQL筆記
- [PL/SQL]10g PL/SQL學習筆記(二)SQL筆記
- [PL/SQL]10g PL/SQL學習筆記(三)SQL筆記
- 03_SHELL程式設計之條件判斷和流程控制程式設計
- PL/SQL 迴圈SQL
- PL/SQL 遊標SQL
- PL/SQL 運算子SQL
- PL/SQL 條件SQL
- pl/sql to_dateSQL
- PL/SQL 基礎SQL
- Oracle PL/SQL INDICESOracleSQL
- PL/SQl Developer使用SQLDeveloper
- pl/sql陣列SQL陣列
- pl/sql練習SQL
- oracle PL/SQL示例OracleSQL
- 淺談pl/sqlSQL
- PL/SQL 索引表SQL索引