一、pl/sql的进阶--控制结构
在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构。
在本部分学习完成后,希望大家达到:
1.使用各种if语句
2.使用循环语句
3.使用控制语句——goto和null(goto语句不推荐使用);

二、条件分支语句
pl/sql中提供了三种条件分支语句if—then,if–then–else,if–then–else if–then。
这里我们可以和java语句进行一个比较。

1)、简单的条件判断if–then
问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。

  1. SET serveroutput ON;
    CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS
    --定义
    V_SAL EMP.SAL%TYPE;
    BEGIN
    --执行
    SELECT SAL INTO V_SAL FROM EMP WHERE ENAME = SPNAME;
    --判断
    IF V_SAL < 2000 THEN
    UPDATE EMP SET SAL = SAL + SAL * 0.1 WHERE ENAME = SPNAME;
    COMMIT;
    END IF;
    END;
    /
  2.  
  3. --调用存储过程
    exec SP_PRO6('ALLEN');

2)、二重条件分支 if–then–else
问题:编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200;

  1. CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS
    --定义
    V_COMM EMP.COMM%TYPE;
    BEGIN
    --执行
    SELECT COMM INTO V_COMM FROM EMP WHERE ENAME = SPNAME;
    --判断
    IF V_COMM <> 0 THEN
    UPDATE EMP SET COMM = COMM + 100 WHERE ENAME = SPNAME;
    ELSE
    UPDATE EMP SET COMM = COMM + 200 WHERE ENAME = SPNAME;
    END IF;
    COMMIT;
    END;
    /
  2.  
  3. --调用存储过程
    exec SP_PRO6('ALLEN');

3)、多重条件分支 if–then–ELSIF–then
问题:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER 就给他的工资增加500,其它职位的雇员工资增加200。

  1. CREATE OR REPLACE PROCEDURE SP_PRO6(SPNO NUMBER) IS
    --定义
    V_JOB EMP.JOB%TYPE;
    BEGIN
    --执行
    SELECT JOB INTO V_JOB FROM EMP WHERE EMPNO = SPNO;
    IF V_JOB = 'PRESIDENT' THEN
    UPDATE EMP SET SAL = SAL + 1000 WHERE EMPNO = SPNO;
    ELSIF V_JOB = 'MANAGER' THEN
    UPDATE EMP SET SAL = SAL + 500 WHERE EMPNO = SPNO;
    ELSE
    UPDATE EMP SET SAL = SAL + 200 WHERE EMPNO = SPNO;
    END IF;
    COMMIT;
    END;
    /
    --调用存储过程
    exec SP_PRO6(7499);

三、循环语句–loop
是pl/sql中最简单的循环语句,这种循环语句以loop开头,以end loop结尾,这种循环至少会被执行一次。
案例:现有一张表users,表结构如下:
用户vid | 用户名 uname

  1. CREATE TABLE USERS(
    vid NUMBER(5),
    uname VARCHAR2(30)
    );

请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加。

  1. CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS
    --定义 :=表示赋值
    V_NUM NUMBER := 1;
    BEGIN
    LOOP
    INSERT INTO USERS VALUES (V_NUM, SPNAME);
    --判断是否要退出循环
    EXIT WHEN V_NUM = 10;
    --自增
    V_NUM := V_NUM + 1;
    END LOOP;
    COMMIT;
    END;
    /
  2.  
  3. --调用存储过程
    EXEC SP_PRO6('ALLEN');

四、循环语句–while循环
基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以while...loop开始,以end loop 结束。
案例:现有一张表users,表结构如下:
用户vid | 用户名 uname
问题:请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。

  1. CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS
    --定义 :=表示赋值
    V_NUM NUMBER := 11;
    BEGIN
    WHILE V_NUM <= 20 LOOP
    --执行
    INSERT INTO USERS VALUES (V_NUM, SPNAME);
    V_NUM := V_NUM + 1;
    END LOOP;
    COMMIT;
    END;
    /
  2.  
  3. --调用存储过程
    EXEC SP_PRO6('ALLEN');

五、循环语句–for循环
基本for循环的基本结构如下

  1. CREATE OR REPLACE PROCEDURE SP_PRO6 IS--注意如果无参记得不要加()
    BEGIN
    FOR I IN REVERSE 1 .. 10 LOOP --REVERSE反转函数,表示I101递减,去掉REVERSE表示I110递增
    INSERT INTO USERS VALUES (I, 'shunping');
    END LOOP;
    END;
    /
  2.  
  3. --调用存储过程
    EXEC SP_PRO6;

我们可以看到控制变量i,在隐含中就在不停地增加。

六、顺序控制语句–goto、null
1)、goto语句
goto语句用于跳转到特定符号去执行语句。注意由于使用goto语句会增加程序的复杂性,并使得应用程序可读性变差,所以在做一般应用开发时,建议大家不要使用goto语句。
基本语法如下goto lable,其中lable是已经定义好的标号名

  1. set serveroutput on;
    DECLARE
    I INT := 1;
    BEGIN
    LOOP
    DBMS_OUTPUT.PUT_LINE('输出i=' || I);
    IF I = 1 THEN
    GOTO END_LOOP;
    END IF;
    I := I + 1;
    END LOOP;
    <<END_LOOP>>
    DBMS_OUTPUT.PUT_LINE('循环结束');
    END;
    /

2)、null语句
null语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高pl/sql的可读性。

  1. SET serveroutput ON;
    DECLARE
    V_SAL EMP.SAL%TYPE;
    V_ENAME EMP.ENAME%TYPE;
    BEGIN
    SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM EMP WHERE EMPNO = &NO;
    IF V_SAL < 3000 THEN
    UPDATE EMP SET COMM = SAL * 0.1 WHERE ENAME = V_ENAME;
    dbms_output.put_line('1111');
    ELSE
    NULL;
    dbms_output.put_line('2222');--不会被执行
    END IF;
    END;
    /

参见:http://www.cnblogs.com/linjiqin/archive/2012/02/28/2371142.html

oracle pl/sql 控制结构(分支,循环,控制)的更多相关文章

  1. Oracle PL/SQL中的循环处理(sql for循环)

    今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解. PL/SQL也和我们常用的编程语言 ...

  2. Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  3. [转载]Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  4. oracle pl/sql中的循环及if语句

    for循环 /* for循环打印1到10 */ set serveroutput on; declare begin .. loop dbms_output.put_line(i); end loop ...

  5. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  6. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  7. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  8. Oracle PL/SQL 语言(Procedural Language/SQL)

    Oracle PL/SQL 语言(Procedural Language/SQL)是结合了结构化查询与 Oracle 自身过程控制为一体的强大语言,PL/SQL 不但支持更多的数据类型,拥有自身的变量 ...

  9. Oracle PL/SQL编程

    一.PL/SQL简介 1.概念:PL/SQL是Oracle在标准SQL语言上的过程性扩展. 2.优点和特性 提高应用程序的运行性能 提供模块化的程序设计功能 允许定义标示符 具有过程语言控制结构 具备 ...

随机推荐

  1. sphinx随笔记了一下

    sphinx笔记 一:下载中文版coreseek包1:解压后,将etc下的mysql.conf文件复制一份放到上级目录下,改名为sphinx.conf2:配置文件: 2.1:source配置数据源so ...

  2. 【Linux】ssh免密登录

    一.ssh免密配置 ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例.有机器A(192.168.1.155),B(192.168. ...

  3. Docker 集群环境实现的新方式

    近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技 ...

  4. diff.js 列表对比算法 源码分析

    diff.js列表对比算法 源码分析 npm上的代码可以查看 (https://www.npmjs.com/package/list-diff2) 源码如下: /** * * @param {Arra ...

  5. Linux学习之路 -- 简单日常使用命令

    tail -f catalina.out #在 logs 下面查看日志( -f 实时查看) rm -rf /var/log/httpd/access #删除文件(-r删除文件 并删除文件夹下的内容 - ...

  6. JavaWeb程序利用Servlet的对SQLserver增删改查操作

    声明:学了几天终于将增删改查的操作掌握了,也发现了一些问题,所以总结一下. 重点:操作数据库主要用的是SQL语句跟其他无关. 一:前提知识:PreparedStatement PreperedStat ...

  7. 第1阶段——u-boot分析之make 100ask24x0_config指令(1)

    本文学习目标:         掌握"make 100ask24x0_config"指令在Makefile和mkconfig文件中是怎么实现配置芯片选型 1.执行make 100a ...

  8. JavaScript二维码生成——qrcode.js

    在开发中,有时候,我们需要根据不同的内容来动态生成二维码,则可以使用qrcode.js这个小插件来实现. 1.qrcode.js文件内容: (1)未压缩(qrcode.js): /** * @file ...

  9. 【1414软工助教】团队作业6——展示博客(Alpha版本) 得分榜

    题目 团队作业6--展示博客(Alpha版本) 作业提交情况情况 为所欲为 团队没有提交,其余都按时提交. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2: ...

  10. 201521123099 《Java程序设计》第2周学习总结

    1. 本周学习总结 1.Java对我来说难度还是很大.需要花更多时间去学习. 2. 书面作业 1.使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)?分析String使用什么来 ...