源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 3(PL/SQL语言概览)
2016-10-31 11:50
846 查看
又是控制语言,这部分内容本身就是一个循环,一次又一次的出现在你的眼前。这也正说明了,这其实是编程中最基础的部分。
--12.2.4 程序控制语言
--代码12.13 IF语句使用示例
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '史密斯'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, comm INTO v_sal, v_comm FROM emp WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp SET sal = sal * 1.12 WHERE ename = v_ename;
else
DBMS_OUTPUT.put_line('没有对史密斯进行薪资调整的动作。');
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
select * from emp where ename='史密斯';
--代码12.14 If...else语句使用示例
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '史密斯'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, comm INTO v_sal, v_comm FROM emp WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp SET sal = sal * 1.12 WHERE ename = v_ename;
ELSE
UPDATE emp SET sal = sal * 1.05 WHERE ename = v_ename;
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
--代码12.15 If...elsif语句使用示例
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '史密斯'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, comm INTO v_sal, v_comm FROM emp WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp SET sal = sal * 1.12 WHERE ename = v_ename;
--如果工资加提成在3000到4000之间
ELSIF v_sal+v_comm>3000 AND v_sal+v_comm<4000 THEN
UPDATE emp SET sal = sal * 1.1 WHERE ename = v_ename;
--如果工资加提成在4000到5000之间
ELSIF v_sal+v_comm>4000 AND v_sal+v_comm<5000THEN
UPDATE emp SET sal = sal * 1.08 WHERE ename = v_ename;
ELSE
--否则如果工资大于5000
UPDATE emp SET sal = sal * 1.05 WHERE ename = v_ename;
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
--代码12.16 简单case语句使用示例
DECLARE
grade CHAR(1); --定义成绩等级变量
BEGIN
grade := 'B'; --指定成绩等级为B
CASE grade --使用简单CASE语句根据成绩等级返回成绩信息
WHEN 'A' THEN
DBMS_OUTPUT.PUT_LINE('优秀');
WHEN 'B' THEN
DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN
DBMS_OUTPUT.PUT_LINE('好');
WHEN 'D' THEN
DBMS_OUTPUT.PUT_LINE('一般');
WHEN 'F' THEN
DBMS_OUTPUT.PUT_LINE('普通');
ELSE --如果所有条件都不满足则指定ELSE语句
DBMS_OUTPUT.PUT_LINE('无此等级');
END CASE;
END;
--代码12.17 搜索case语句使用示例
DECLARE
grade CHAR(1);
BEGIN
grade := 'B'; --为成绩等级赋初值
CASE --使用搜索CASE语句返回成绩等级
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('好');
WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('一般');
WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('差');
END CASE;
EXCEPTION --由于没有ELSE子句,因此当WHEN都不匹配则抛出异常
WHEN CASE_NOT_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有这样的成绩等级!');
END;
/
--12.2.6 循环控制语句
--1. 简单循环
--代码12.18 简单循环使用示例
DECLARE
x NUMBER := 0;
y NUMBER :=100;
BEGIN
LOOP
--输出循环变量的值,查看循环的执行变化
DBMS_OUTPUT.PUT_LINE ('循环中变量的值: x = ' || TO_CHAR(x));
x := x + 1;
--如果x的值大于3,则使用EXIT无条件退出循环
IF x > 20 THEN
EXIT;
END IF;
--如果y除与x的余数大于5,则退出循环,这里使用了EXIT WHEN进行条件退出
EXIT WHEN y mod x>5;
END LOOP;
--循环退出后,输出循环的值
DBMS_OUTPUT.PUT_LINE('循环结束变量的值: x = ' || TO_CHAR(x));
END;
/
--代码12.19 嵌套循环使用示例(如果人工计算的话,挺容易出错)
DECLARE
s PLS_INTEGER := 0;
i PLS_INTEGER := 0;
j PLS_INTEGER; --定义变量,使用PL/SQL特有的PLS_INTEGER类型
BEGIN
<<outer_loop>> --指定外层循环
LOOP
i := i + 1;
j := 0;
<<inner_loop>> --指定内存循环
LOOP
j := j + 1;
s := s + i * j; --汇总i和j的值,赋给变量s
DBMS_OUTPUT.PUT_LINE('当前变量s的值为 ' || TO_CHAR(s));
EXIT inner_loop WHEN (j > 5); --如果j的值大于5,则退出内存循环
DBMS_OUTPUT.PUT_LINE('当前变量i,j的值分别为 ' || TO_CHAR(i)||','||to_char(j));
EXIT outer_loop WHEN ((i * j) > 15); --如果i*j的值大于15,则退出外层循环
END LOOP inner_loop; --在END LOOP后面指定命名标签,以区别循环
DBMS_OUTPUT.PUT_LINE('当前变量i,j的值分别为 ' || TO_CHAR(i)||','||to_char(j));
END LOOP outer_loop;
DBMS_OUTPUT.PUT_LINE
('变量s最终的值为 ' || TO_CHAR(s)); --输出变量的值
END;
/
--代码12.20 continue when使用示例
DECLARE
x NUMBER := 0;
BEGIN
LOOP
-- 当调用了CONTINUE语句后,循环将从CONTINUE或CONTINUE WHEN的位置退出
DBMS_OUTPUT.PUT_LINE('循环计数变量: x = ' || TO_CHAR(x));
x := x + 1;
--如果x<3,则不执行下面的到END LOOP之间的代码,跳到循环开始处
CONTINUE WHEN x<3;
DBMS_OUTPUT.PUT_LINE('循环计数变量,在CONTINUE之后: x = ' ||TO_CHAR(x));
--必须具有EXIT或EXIT WHEN语句,否则将会进行死循环
EXIT WHEN x=5;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束后循环变量的值: x = ' || TO_CHAR(x));
END;
--2. 数字式循环
--代码12.21 简单的数字时for循环使用示例
BEGIN
--使用数字式FOR循环插入3本书
FOR i IN 1..3 LOOP
INSERT INTO books VALUES(1080+i,'矛盾文学第'||TO_CHAR(i)||'册',3);
--输出插入的图书信息
DBMS_OUTPUT.put_line('插入了矛盾文学第'||TO_CHAR(i)||'册');
END LOOP;
END;
--代码12.22 for反向循环示例
BEGIN
--使用反向循环从高到低进行循环
FOR i IN REVERSE 1..5 LOOP
--输出循环计数器信息
DBMS_OUTPUT.put_line('循环计数器为'||TO_CHAR(i));
END LOOP;
END;
--代码12.23 在for循环中使用步进值(使用辅助变量)
DECLARE
v_step PLS_INTEGER := 5; --定义步进值为5,表示每次步进5个数值
v_value PLS_INTEGER;
BEGIN
FOR i IN 1..3 LOOP --使用数字式FOR循环
v_value:=i*v_step;
DBMS_OUTPUT.PUT_LINE ('当前循环后的值为 '||v_value); --输出步进后的值
END LOOP;
END;
--12.2.4 程序控制语言
--代码12.13 IF语句使用示例
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '史密斯'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, comm INTO v_sal, v_comm FROM emp WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp SET sal = sal * 1.12 WHERE ename = v_ename;
else
DBMS_OUTPUT.put_line('没有对史密斯进行薪资调整的动作。');
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
select * from emp where ename='史密斯';
--代码12.14 If...else语句使用示例
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '史密斯'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, comm INTO v_sal, v_comm FROM emp WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp SET sal = sal * 1.12 WHERE ename = v_ename;
ELSE
UPDATE emp SET sal = sal * 1.05 WHERE ename = v_ename;
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
--代码12.15 If...elsif语句使用示例
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '史密斯'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, comm INTO v_sal, v_comm FROM emp WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp SET sal = sal * 1.12 WHERE ename = v_ename;
--如果工资加提成在3000到4000之间
ELSIF v_sal+v_comm>3000 AND v_sal+v_comm<4000 THEN
UPDATE emp SET sal = sal * 1.1 WHERE ename = v_ename;
--如果工资加提成在4000到5000之间
ELSIF v_sal+v_comm>4000 AND v_sal+v_comm<5000THEN
UPDATE emp SET sal = sal * 1.08 WHERE ename = v_ename;
ELSE
--否则如果工资大于5000
UPDATE emp SET sal = sal * 1.05 WHERE ename = v_ename;
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
--代码12.16 简单case语句使用示例
DECLARE
grade CHAR(1); --定义成绩等级变量
BEGIN
grade := 'B'; --指定成绩等级为B
CASE grade --使用简单CASE语句根据成绩等级返回成绩信息
WHEN 'A' THEN
DBMS_OUTPUT.PUT_LINE('优秀');
WHEN 'B' THEN
DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN
DBMS_OUTPUT.PUT_LINE('好');
WHEN 'D' THEN
DBMS_OUTPUT.PUT_LINE('一般');
WHEN 'F' THEN
DBMS_OUTPUT.PUT_LINE('普通');
ELSE --如果所有条件都不满足则指定ELSE语句
DBMS_OUTPUT.PUT_LINE('无此等级');
END CASE;
END;
--代码12.17 搜索case语句使用示例
DECLARE
grade CHAR(1);
BEGIN
grade := 'B'; --为成绩等级赋初值
CASE --使用搜索CASE语句返回成绩等级
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('好');
WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('一般');
WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('差');
END CASE;
EXCEPTION --由于没有ELSE子句,因此当WHEN都不匹配则抛出异常
WHEN CASE_NOT_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有这样的成绩等级!');
END;
/
--12.2.6 循环控制语句
--1. 简单循环
--代码12.18 简单循环使用示例
DECLARE
x NUMBER := 0;
y NUMBER :=100;
BEGIN
LOOP
--输出循环变量的值,查看循环的执行变化
DBMS_OUTPUT.PUT_LINE ('循环中变量的值: x = ' || TO_CHAR(x));
x := x + 1;
--如果x的值大于3,则使用EXIT无条件退出循环
IF x > 20 THEN
EXIT;
END IF;
--如果y除与x的余数大于5,则退出循环,这里使用了EXIT WHEN进行条件退出
EXIT WHEN y mod x>5;
END LOOP;
--循环退出后,输出循环的值
DBMS_OUTPUT.PUT_LINE('循环结束变量的值: x = ' || TO_CHAR(x));
END;
/
--代码12.19 嵌套循环使用示例(如果人工计算的话,挺容易出错)
DECLARE
s PLS_INTEGER := 0;
i PLS_INTEGER := 0;
j PLS_INTEGER; --定义变量,使用PL/SQL特有的PLS_INTEGER类型
BEGIN
<<outer_loop>> --指定外层循环
LOOP
i := i + 1;
j := 0;
<<inner_loop>> --指定内存循环
LOOP
j := j + 1;
s := s + i * j; --汇总i和j的值,赋给变量s
DBMS_OUTPUT.PUT_LINE('当前变量s的值为 ' || TO_CHAR(s));
EXIT inner_loop WHEN (j > 5); --如果j的值大于5,则退出内存循环
DBMS_OUTPUT.PUT_LINE('当前变量i,j的值分别为 ' || TO_CHAR(i)||','||to_char(j));
EXIT outer_loop WHEN ((i * j) > 15); --如果i*j的值大于15,则退出外层循环
END LOOP inner_loop; --在END LOOP后面指定命名标签,以区别循环
DBMS_OUTPUT.PUT_LINE('当前变量i,j的值分别为 ' || TO_CHAR(i)||','||to_char(j));
END LOOP outer_loop;
DBMS_OUTPUT.PUT_LINE
('变量s最终的值为 ' || TO_CHAR(s)); --输出变量的值
END;
/
--代码12.20 continue when使用示例
DECLARE
x NUMBER := 0;
BEGIN
LOOP
-- 当调用了CONTINUE语句后,循环将从CONTINUE或CONTINUE WHEN的位置退出
DBMS_OUTPUT.PUT_LINE('循环计数变量: x = ' || TO_CHAR(x));
x := x + 1;
--如果x<3,则不执行下面的到END LOOP之间的代码,跳到循环开始处
CONTINUE WHEN x<3;
DBMS_OUTPUT.PUT_LINE('循环计数变量,在CONTINUE之后: x = ' ||TO_CHAR(x));
--必须具有EXIT或EXIT WHEN语句,否则将会进行死循环
EXIT WHEN x=5;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束后循环变量的值: x = ' || TO_CHAR(x));
END;
--2. 数字式循环
--代码12.21 简单的数字时for循环使用示例
BEGIN
--使用数字式FOR循环插入3本书
FOR i IN 1..3 LOOP
INSERT INTO books VALUES(1080+i,'矛盾文学第'||TO_CHAR(i)||'册',3);
--输出插入的图书信息
DBMS_OUTPUT.put_line('插入了矛盾文学第'||TO_CHAR(i)||'册');
END LOOP;
END;
--代码12.22 for反向循环示例
BEGIN
--使用反向循环从高到低进行循环
FOR i IN REVERSE 1..5 LOOP
--输出循环计数器信息
DBMS_OUTPUT.put_line('循环计数器为'||TO_CHAR(i));
END LOOP;
END;
--代码12.23 在for循环中使用步进值(使用辅助变量)
DECLARE
v_step PLS_INTEGER := 5; --定义步进值为5,表示每次步进5个数值
v_value PLS_INTEGER;
BEGIN
FOR i IN 1..3 LOOP --使用数字式FOR循环
v_value:=i*v_step;
DBMS_OUTPUT.PUT_LINE ('当前循环后的值为 '||v_value); --输出步进后的值
END LOOP;
END;
相关文章推荐
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 5(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 2(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 4(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 1(PL/SQL基础)
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 1(使用PL/SQL记录)
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 2(使用PL/SQL记录)
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 4(使用动态批量绑定)
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 2(使用EXECUTE IMMEDIATE)
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 1(理解动态SQL语句)
- 源码-Oracle数据库管理-第十八章-事务和锁-Part 2_1(使用Oracle锁)
- oracle 数据库的管理工具 PL/SQL_Developer 的简易使用 与Java 连接并查询显示出数据
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 3(使用集合类型)
- 源码-Oracle数据库管理-第十八章-事务和锁-Part 2_2(使用Oracle锁)
- 源码-Oracle数据库管理-第九章-SQL查询-Part 3(多表连接查询)
- 源码-Oracle数据库管理-第九章-SQL查询-Part 5(分组查询)
- 源码-Oracle数据库管理-第九章-SQL查询-Part 1(基本查询)
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 4(使用集合类型)
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 3(多行查询语句)
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 5(动态SQL的性能优化技巧)
- 源码-Oracle数据库管理-第十八章-事务和锁-Part 1(使用Oracle事务)