PL/SQL控制结构
顺序结构
按先后顺序
分支判断结构
IF语句
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
例:
DECLARE
v_myage number :=31;
BEGIN
IF v_myage<11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSIF v_myage<20 THEN
DBMS_OUTPUT.PUT_LINE(' I am young');
ELSIF v_myage<30 THEN
DBMS_OUTPUT.PUT_LINE('I am in twenties');
ELSIF v_myage<40 THEN
DBMS_OUTPUT.PUT_LINE(' I am in thirties');
ELSE
DBMS_OUT.PUT_LINE(' I am always yound');
END IF;
END;
/
例:
DECLARE
v_myage number;
BEGIN
IF v_myage <11 THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child');
END IF;
END;
/
注:初始化不赋值默认为NULL,不能确定其数值。
CASE表达式
CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
WHEN expressionN THEN resultN
END;
例:
SET VERIFY OFF
DECLARE
v_grade CHAR(1) := UPPER('&grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE v_grade
WHEN 'A' THEN 'Excllent'
WHEN 'B' THEN ' Very Good'
WHEN 'C' THEN 'GOOD'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LIND('Grade: ' || v_grade || 'Appraisal ' || v_appraisal);
END;
/
CASE语句
例:
DECARE
v_deptid NUMBER;
v_deptname VARCHAR2(20);
v_emps NUMBER;
v_mngid NUMBER := 108;
BEGIN
CASE v_mngid
WHEN 108 THEN
SELECT department_id,department_name
INTO v_deptid,v_deptname FROM departments
WHERE manager_id=108;
SELECT cout(*) INTO v_emps FROMemployees
WHERE department_id=v_deptid;
WHEN 200 THEN
END CASE;
DBMS_OUTPUT.PUT_LINE('You are working in the ' || v_deptname ||
'department. There are ' || v_emps || 'employees in this departmen');
END;
/
NULL逻辑运算
FALSE AND NULL = FALSE
FALSE OR NULL = NULL
短路
两种条件中只要判断一个条件成立则执行下一步
IF condtion1 AND condition2
THEN
statements;
ELSE
statements;
END IF;
IF condition1 OR condition2
THEN
statements;
ELSE
statements;
END IF;
GOTO语句
GOTO label_name;
GOTO语句用作无条件跳转,但只能在pl/sql块内部跳转,需要与标签连用,但是标签后不能直接跟END,如果没有表达式则加多一行NULL;
例:
DECLARE
…
BEGIN
IF condition THEN GOTO lastpoint END IF;
…
<<lastpoint>>
NULL;
END;
例:
BEGIN
GOTO second_output;
DBMS_OUTPUT.PUT_LINE('The line will never execute.');
<<second_output>>
DBMS_OUT.PUT_LINE('We are here!');
END;
/
循环结构
Basic loop(基本循环)至少被执行一次
LOOP
statement1;
EXIT [WHEN condition];(退出循环)
END;
例:
DECLARE
v_countryid loactions.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_counter NUMBER(2) :=1;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_loc_id FROM locations
WHERE contry_id = v_countryid;
LOOP
INSERT INTO locatinos(location_id,city,country_id)
VALUES ((v_loc_id + v_counter),v_new_city,v_countryid);
v_counter := v_counter+1;
EXIT WHEN v_counter>3;
END LOOP;
END;
/
FOR loop (FOR循环)
FOR counter IN [ REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
..
END LOOP;
注释:counter 不需要定义,在END LOOP后就不能再被使用
例:
DECLARE
v_coutryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_loc_id
FROM locations
WHERE country_id = v_countryid;
FOR i IN 1..3 LOOP
INSERT INTO locations(location_id,city,country_id)
VALUES((v_loc_id + i), v_new_city,v_countryid);
END LOOP;
END;
/
WHILE loop(WHILE循环)
WHILE condition LOOP
statement1;
statement2;
END LOOP;
例:
DECLARE
v_contryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TPYE := 'Montreal';
v_counter NUMBER :=1;
BEGIN
SELECT MAX(location_id) INTO v_loc_id FROM locations
WHERE country_id = v_contryid;
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id,city,country_id)
VALUES((v_loc_id + v_counter),v_new_city,v_countryid);
v_counter := v_counter +1;
END LOOP;
END;
/
例:多重循环
…
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<< Inner_loop>>
LOOP
…
EXIT Outer_loop WHEN total_done = 'YES';
--Leave both loops
EXIT WHEN inner_done = 'Yes';
--Leave inner loop only
…
END LOOP inner_loop;
…
END LOOP Outer_loop;
END;
/
CONTINUE语句
例:
DECLARE
v_total SIMPLE_TINTEGER :=0;
BEGIN
FOR i IN 1..10 LOOP
v_total := v_total +1;
DBMS_OUTPUT.PUT_LINE('Total is: ' || v_total);
CONTINUE WHEN i>5;
v_totail := v_total + I;
DBMS_OUTPUT.PUT_LINE('out of Loop Total is: ' || v_total);
END LOOP;
END;
/
例:使用标签跳转到外层循环
DECLARE
v_total NUMBER :=0;
BEGIN
<<BeforeTopLoop>>
FOR i IN 1..10 LOOP
v_total := v_total +1;
DBMS_OUTPUT.PUT_LINE('Total is: ' || v_total);
FOR j IN 1..10 LOOP
CONTINUE BeforeTopLoop WHEN i+j>5;
v_total :=v_total +1;
END LOOP;
END LOOP;
END two_loop;
程序员的基础教程:菜鸟程序员
PL/SQL控制结构的更多相关文章
- oracle pl/sql 控制结构(分支,循环,控制)
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
- oracle PL/SQL语法基础
目录 数据类型 定义变量 PL/SQL控制结构 参考资料 Oracle10g数据类型总结 PL/SQL之基础篇 数据类型 学习总结 字符类型 char.nchar.varchar.nvarchar:有 ...
- Oracle PL/SQL编程
一.PL/SQL简介 1.概念:PL/SQL是Oracle在标准SQL语言上的过程性扩展. 2.优点和特性 提高应用程序的运行性能 提供模块化的程序设计功能 允许定义标示符 具有过程语言控制结构 具备 ...
- oracle PL/SQL(procedure language/SQL)程序设计--控制结构(if else )
IF逻辑结构:IF-THEN-END IFIF-THEN-ELSE-END IFIF-THEN-ELSIF-END IF 语法 IF condition THEN statements;[ELSIF ...
- 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
- pl/sql的控制结构,分支、循环、控制
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
- pl/sql进阶一控制结构
在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...
- Oracle pl/sql编程值控制结构
以下测试案例均来自于scott方案,运行前请确保该方案解锁. 1.条件分支状语 pl/sql中提供了三种条件分支状语,分别是: if then if then else if then ...
- PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务
1.条件控制 A. IF条件分支语法: if (条件1) then 语句; elsif (条件2) then 语句; elsif (条件3) then 语句; else 语句; end if; B . ...
随机推荐
- centos7证书安全登录
生成一对密钥,本地私钥匹配线上主机的公钥进行登录,比密码登录更加安全方便. 本文适用MAC/Linux的本地环境 1.本地生成一对密钥 ssh-keygen -t rsa 2.把生成的公钥上传到线上主 ...
- @RequestBody, @ResponseBody 注解详解(转)
原文地址: https://www.cnblogs.com/qq78292959/p/3760651.html @RequestBody, @ResponseBody 注解详解(转) 引言: 接上一篇 ...
- PHP异步扩展Swoole笔记(2)
dispatch_mode, 数据包分发策略 可以选择7种类型,默认为21,轮循模式,收到会轮循分配给每一个Worker进程2,固定模式,根据连接的文件描述符分配Worker.这样可以保证同一个连接发 ...
- phpBB3导入帖子的Python脚本
关联的数据表 在phpBB3中导入用户时, 需要处理的有两张表, 一个是 topics, 一个是 posts.为了方便与原数据关联, 需要在这两个表上新增一个字段并建立唯一索引 ALTER TABLE ...
- RobotFrameWork编写接口测试及如何断言
1. 前言 本篇是第一系列(Http接口自动化)的第五课程,如果对系列课程大纲不清楚的,可以查看<RobotFramework系列免费课程-开课了~>. 前面我们介绍了,在真正实施前,需先 ...
- python两个 list 获取交集,并集,差集的方法
1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] # ...
- Mybatis判断map参数是否存在
<select id="selectByCondition" parameterType="java.util.HashMap" resultMap=&q ...
- 【原创 深度学习与TensorFlow 动手实践系列 - 2】第二课:传统神经网络
第二课 传统神经网络 <深度学习>整体结构: 线性回归 -> 神经网络 -> 卷积神经网络(CNN)-> 循环神经网络(RNN)- LSTM 目标分类(人脸识别,物品识别 ...
- 【转】RPC简单介绍
RPC简单介绍 RPC 1. RPC是什么 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...
- 【Unity】通用的Debugger日志模块
模块代码整理自 http://gad.qq.com/lore/catalog/10007 Debugger类.提供打印日志的静态方法. using System; using System.IO; n ...