您的位置:首页 > 数据库 > Oracle

源码-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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐