源码PL/SQL从入门到精通第四章PL/SQL控制语句
控制语句对任何一门语言、任何一个程序员而言,都是基础中的基础。
学了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;相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/net/10541.shtml
相关文章
热门TAG
命令 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 技巧 权重 服务器 网站流量 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows 蜘蛛 搜索引擎 网站收录 JSP 实例解析最新文章
-
如何给asp.net core写个中间
时间:2021-01-03
-
.Net微信网页开发解决用户
时间:2021-01-03
-
c++中Socket通信函数之WSAS
时间:2020-12-29
-
提高生产性工具
时间:2020-12-29
-
全新的membership框架Asp.ne
时间:2020-12-29
-
不用找了,比较全的signal
时间:2020-12-29
-
计算字符串中每种字符出
时间:2020-12-29
-
EntityFramework 5.0 CodeFirst 教
时间:2020-12-29
热门文章
-
.NET 开发环境搭建图文详解
时间:2020-12-27
-
Windows下Visual Studio 2017安装配置方法图文教
时间:2020-12-23
-
.Net微信网页开发解决用户在不同公众号或
时间:2021-01-03
-
oracle 11g rac安装之grid报错解决
时间:2020-12-28
-
ASP.NET Core 3.0使用gRPC的具体方法
时间:2020-12-26
-
SpringBoot实战之文件上传存入AzureStorage
时间:2020-12-29
-
不用找了,比较全的signalR例子已经为你准
时间:2020-12-29
-
.NET Core3.1编写混合C++程序
时间:2020-12-26
-
Oracle的卸载
时间:2020-12-28
-
计算字符串中每种字符出现的次数[Dicti
时间:2020-12-29
