标签:
控制语句对任何一门语言、任何一个程序员而言,都是基础中的基础。
学了PL/SQL,才体会到Java语法的简洁,简直不是一个时代的东西;当然,他们的定位本来就不一样,不能以己之长比之他人之短。
--第4章开始 --代码4.1 最简单的IF语句使用示例 DECLARE v_count NUMBER(10) := 0; --定义计数器变量 v_empno NUMBER(4) := 7888; --定义员工编号 BEGIN SELECT COUNT(1) --首先查询指定的员工编号是否存在 INTO v_count FROM emp WHERE empno = v_empno; --使用IF语句判断,如果员工编号不存在,结果为0 IF v_count = 0 THEN --则执行INSERT语句,插入新的员工记录 INSERT INTO emp (empno, ename, job, hiredate, sal, deptno) VALUES (v_empno, '张三', '经理', TRUNC(SYSDATE), 1000, 20); ELSIF v_count >= 1 THEN DBMS_OUTPUT.put_line('该员工已存在。'); END IF; --向数据库提交更改 COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(SQLERRM); --输出异常信息 END; select * from emp; --代码4.2 IF-THEN-ELSE DECLARE v_count NUMBER(10) := 0; --定义计数器变量 v_empno NUMBER(4) := 7888; --定义员工编号 BEGIN SELECT COUNT(1) --首先查询指定的员工编号是否存在 INTO v_count FROM emp WHERE empno = v_empno; --使用IF语句判断,如果员工编号不存在,结果为0 IF v_count = 0 THEN --则执行INSERT语句,插入新的员工记录 INSERT INTO emp (empno, ename, job, hiredate, sal, deptno) VALUES (v_empno, '张三', '经理', TRUNC(SYSDATE), 1000, 20); ELSE --否则,执行UPDATE语句更新员工记录 UPDATE emp SET ename = '黄阔', job = '顾问', hiredate = TRUNC(SYSDATE), sal = 100000, deptno = 20 WHERE empno = v_empno; END IF; --向数据库提交更改 COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(SQLERRM); --输出异常信息 END; --代码4.3 嵌套的IF语句 DECLARE v_sal NUMBER (11, 2); --薪资变量 v_deptno NUMBER (2); --部门变量 v_job VARCHAR2 (9); --职位变量 BEGIN --从数据库中查询指定员工编号的信息 SELECT deptno, v_job, sal INTO v_deptno, v_job, v_sal FROM emp WHERE empno = &empno; --如果部门编号为20的员工 IF v_deptno = 20 THEN --如果职别为CLERK IF v_job = 'CLERK' THEN --加薪0.12 v_sal := v_sal * (1 + 0.12); --如果职别为ANALYST ELSIF v_job = 'ANALYST' THEN --加薪0.19 v_sal := v_sal * (1 + 0.19); END IF; --否则,不为20的员工将不允许加薪 ELSE DBMS_OUTPUT.put_line ('仅部门编号为20的员工才能加薪'); END IF; END; --代码 4.4 IF-THEN-ELSIF分支示例 DECLARE --定义替换变量 (此处&tmpVar要放到引号内,否则运行时报错) v_character CHAR(1) :='&tmpVar'; BEGIN IF v_character = 'A' --判断字符是否为'A',如果不是,则跳到下一个ELSIF THEN DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character); ELSIF v_character = 'B' --判断字符是否为'B',如果不是,则跳到下一个ELSIF THEN DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character); ELSIF v_character = 'C' --判断字符是否为'C',如果不是,则跳到下一个ELSIF THEN DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character); ELSIF v_character = 'D' --判断字符是否为'D',如果不是,则跳到ELSE语句 THEN DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character); ELSE DBMS_OUTPUT.put_line ('不是A-D之间的字符'); END IF; END; --代码4.5 简单CASE语句使用示例 DECLARE v_job VARCHAR2 (30); --定义保存CASE选择器的字符型变量 v_empno NUMBER (4) := &empno; --定义用来查询员工的员工编号 BEGIN SELECT job --获取选择器v_job的值 INTO v_job FROM emp WHERE empno = v_empno; --当指定了CASE的选择器为v_job后,所有的WHEN子句的类型必须匹配为VARCHAR2类型 CASE v_job WHEN 'CLERK' THEN UPDATE emp SET sal = sal * (1 + 0.15) WHERE empno = v_empno; DBMS_OUTPUT.put_line ('为普通职员加薪15%'); WHEN 'ANALYST' THEN UPDATE emp SET sal = sal * (1 + 0.18) WHERE empno = v_empno; DBMS_OUTPUT.put_line ('为分析人员加薪18%'); WHEN 'MANAGER' THEN UPDATE emp SET sal = sal * (1 + 0.20) WHERE empno = v_empno; DBMS_OUTPUT.put_line ('为管理人员加薪20%'); WHEN 'SALESMAN' THEN UPDATE emp SET sal = sal * (1 + 0.22) WHERE empno = v_empno; DBMS_OUTPUT.put_line ('为销售人员加薪22%'); ELSE --使用ELSE语句显示信息 DBMS_OUTPUT.put_line ('员工职级不在加薪的行列!'); END CASE; --终止CASE语句块 END; --代码4.6 搜索CASE语句使用示例 DECLARE v_sal NUMBER (10, 2); --定义保存薪水的变量 v_empno NUMBER (10) := &empno;--用来查询的员工编号 BEGIN SELECT sal --获取员工薪资信息 INTO v_sal FROM emp WHERE empno = v_empno; --使用搜索CASE语句,判断员工薪资级别 CASE WHEN v_sal BETWEEN 1000 AND 1500 THEN DBMS_OUTPUT.put_line ('员工级别:初级职员'); WHEN v_sal BETWEEN 1500 AND 3000 THEN DBMS_OUTPUT.put_line ('员工级别:中级管理'); WHEN v_sal BETWEEN 3000 AND 5000 THEN DBMS_OUTPUT.put_line ('员工级别:高级经理'); ELSE DBMS_OUTPUT.put_line ('不在级别范围之内'); END CASE; END; --代码4.7 LOOP和EXIT使用示例 DECLARE v_count NUMBER (2) := 0; --定义循环计数变量 BEGIN LOOP --开始执行循环 v_count := v_count + 1; --循环计数器加1 --打印字符信息 DBMS_OUTPUT.put_line ('行' || v_count || ':Hello PL/SQL!'); --如果计数条件为10,则退出循环 IF v_count = 10 THEN EXIT; --使用EXIT退出循环 END IF; END LOOP; --循环退出后,将执行这条语句 DBMS_OUTPUT.put_line ('循环已经退出了!'); END; --代码4.8 LOOP和 EXIT WHEN使用示例 DECLARE v_count NUMBER (2) := 0; --定义循环计数变量 BEGIN LOOP --开始执行循环 v_count := v_count + 1; --循环计数器加1 --打印字符信息 DBMS_OUTPUT.put_line ('行' || v_count || ':Hello PL/SQL!'); --如果计数条件为10,则退出循环 EXIT WHEN v_count=10; END LOOP; --循环退出后,将执行这条语句 DBMS_OUTPUT.put_line ('循环已经退出了!'); END; --代码4.9 使用CONTINUE重新开始循环 DECLARE x NUMBER := 0; BEGIN LOOP -- 开始循环,当遇到CONTINUE语句时,将重新开始LOOP的执行 DBMS_OUTPUT.put_line ('内部循环值: x = ' || TO_CHAR (x)); x := x + 1; IF x < 3 THEN --如果计数器小于3,则重新开始执行循环。 CONTINUE; --使用CONTINUE跳过后面的代码执行,重新开始循环 END IF; --当循环计数大于3时执行的代码 DBMS_OUTPUT.put_line ('CONTINUE之后的值: x = ' || TO_CHAR (x)); EXIT WHEN x = 5; --当循环计数为5时,退出循环 END LOOP; --输出循环的结束值 DBMS_OUTPUT.put_line (' 循环体结束后的值: x = ' || TO_CHAR (x)); END; --代码4.10 使用CONTINUE WHEN 重新开始循环(相比if then conitinue更为简洁) DECLARE x NUMBER := 0; BEGIN LOOP -- 开始循环,当遇到CONTINUE语句时,将重新开始LOOP的执行 DBMS_OUTPUT.put_line ('内部循环值: x = ' || TO_CHAR (x)); x := x + 1; CONTINUE WHEN x<3; --当循环计数大于3时执行的代码 DBMS_OUTPUT.put_line ('CONTINUE之后的值: x = ' || TO_CHAR (x)); EXIT WHEN x = 5; --当循环计数为5时,退出循环 END LOOP; --输出循环的结束值 DBMS_OUTPUT.put_line (' 循环体结束后的值: x = ' || TO_CHAR (x)); END; --代码4.11 使用WHILE-LOOP输出计数器值 DECLARE counter NUMBER := 1; --定义计数器变量 BEGIN WHILE (counter < 10) --判断循环的条件为counter<10 LOOP DBMS_OUTPUT.put_line ('计数器 [' || counter || '].'); IF counter >= 1 --如果循环计数器大于等于1 THEN counter := counter + 1; --将循环计数器加1 END IF; END LOOP; END; --代码4.12 简单的FOR-LOOP示例 DECLARE v_total INTEGER := 0; --循环累计汇总数字 BEGIN FOR i IN 1 .. 3 --使用FOR循环开始循环计数 LOOP v_total := v_total + 1; --汇总累加 DBMS_OUTPUT.put_line ('循环计数器值:' || i); END LOOP; --输出循环结果值 DBMS_OUTPUT.put_line ('循环总计:' || v_total); END; --代码4.13 使用REVERSE的FOR-LOOP示例 DECLARE v_total INTEGER := 0; --循环累计汇总数字 BEGIN FOR i IN REVERSE 1 .. 3 --使用REVERSE从高到低进行循环 LOOP v_total := v_total + 1; --汇总累加 DBMS_OUTPUT.put_line ('循环计数器值:' || i); END LOOP; --输出循环结果值 DBMS_OUTPUT.put_line ('循环总计:' || v_total); END; --代码4.14 动态指定循环边界值 DECLARE v_counter INTEGER := &counter; --动态指定上限边界值变量 BEGIN FOR i IN 1 .. v_counter --在循环中使用变量定义边界 LOOP DBMS_OUTPUT.put_line ('循环计数:' || i); END LOOP; END; --代码4.15 GOTO语句使用示例 DECLARE p VARCHAR2(30); --定义输出字符串变量 n PLS_INTEGER := &prime_number; --定义要判断的数字(此处代码增强为允许用户输入,并且循环输出) BEGIN <<outer>> FOR j IN 2 .. ROUND(SQRT(n)) LOOP --外层循环 IF n MOD j = 0 THEN --判断是否为一个素数 p := ' 不是素数'; --初始化P的值 GOTO print_now; --跳转到print_now标签位置 END IF; END LOOP; p := ' 是一个素数'; --跳转到标签位置 <<print_now>> DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p); n := n - 1; IF n >= 1 THEN GOTO OUTER; ELSE NULL; END IF; END; --代码4.16 GOTO语句模拟循环语句 DECLARE v_counter INT := 0; --定义循环计数器变量 BEGIN <<outer>> --定义标签 v_counter := v_counter + 1; DBMS_OUTPUT.put_line ('循环计数器:' || v_counter); --判断计数器条件 IF v_counter < 5 THEN GOTO OUTER; --向上跳转到标签位置 END IF; END; --代码4.17 NULL语句使用示例 DECLARE v_counter INT := &counter; --允许用户输入变量值 BEGIN IF v_counter > 5 --如果变量值大于5 THEN DBMS_OUTPUT.put_line ('v_counter>5'); --输出信息 ELSE --否则 NULL; --仅占位符,不做任何事情 END IF; END; --代码4.18 NULL与标签使用示例 DECLARE v_result INT := 0; --保存结果值的变量 BEGIN v_result := 16 / 0; --故意被0除 DBMS_OUTPUT.put_line ( '现在时间是:' || TO_CHAR (SYSDATE, 'yyyy-MM-dd HH24:MI:SS') ); EXCEPTION --异常处理语句块 WHEN OTHERS THEN NULL; --当触发任何异常时,什么也不做。 END;
源码-PL/SQL从入门到精通-第四章-PL/SQL控制语句(基础中的基础)
标签:
原文地址:http://blog.csdn.net/hpdlzu80100/article/details/51917537