顺序结构

按先后顺序

分支判断结构

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控制结构的更多相关文章

  1. oracle pl/sql 控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  2. oracle PL/SQL语法基础

    目录 数据类型 定义变量 PL/SQL控制结构 参考资料 Oracle10g数据类型总结 PL/SQL之基础篇 数据类型 学习总结 字符类型 char.nchar.varchar.nvarchar:有 ...

  3. Oracle PL/SQL编程

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

  4. 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 ...

  5. 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  6. pl/sql的控制结构,分支、循环、控制

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  7. pl/sql进阶一控制结构

    在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...

  8. Oracle pl/sql编程值控制结构

    以下测试案例均来自于scott方案,运行前请确保该方案解锁. 1.条件分支状语 pl/sql中提供了三种条件分支状语,分别是: if   then if   then   else if   then ...

  9. PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务

    1.条件控制 A. IF条件分支语法: if (条件1) then 语句; elsif (条件2) then 语句; elsif (条件3) then 语句; else 语句; end if; B . ...

随机推荐

  1. Exchange - Add Owner of Distribution Group

    User Interface: Open Exchange Management Console. Expand Microsoft Exchange On-Premises, then right ...

  2. vue项目启动时将localhost替换成指定ip地址

    1.node启动vue项目时地址一般都是http://localhost:8080 2.config->index.js 中的host:‘localhost’换成host:‘你的本机ip’就可以 ...

  3. Python的虚拟机安装已经如何配置Scrapy for Mac

    时间:2018年2月21日 因为时间问题,以下笔记就粗略记录.仅作为个人笔记为用 安装virtualenv和virtualenvwrapper 如何安装的细节下面这篇也有介绍,包括如何使用切换虚拟机也 ...

  4. Effective Java 第三版——73.抛出合乎于抽象的异常

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. SNF软件开发机器人-子系统-功能-【列表】自由排序-如何配置?

    [列表]自由排序 1.效果展示: 2.使用说明: 打开显示页面,点击开发者选项的简单配置按钮.在功能表信息中选择自由排序复选框后保存.

  6. C# yield return; yield break;

    using System; using System.Collections; namespace YieldDemo { class Program { public static IEnumera ...

  7. SQL2008R2的 遍历所有表更新统计信息 和 索引重建

    [2.以下是更新统计信息] DECLARE UpdateStatisticsTables CURSOR READ_ONLY FOR SELECT sst.name, Schema_name(sst.s ...

  8. Roslyn如何实现简单的代码提示

    假如需要实现一个代码编辑器,其中一个很重要的功能是实现代码提示,类似VS的代码智能提示.下面用Roslyn编译器来实现一个简单的代码提示功能. 代码提示,首先必须需要知道对象的类型信息,然后通过迭代获 ...

  9. HMACSHA1 加密算法

    https://blog.csdn.net/z69183787/article/details/78393216 ******************************************* ...

  10. TensorFlow 图片resize方法

    参见这篇博客 tensorflow里面用于改变图像大小的函数是tf.image.resize_images(image, (w, h), method):image表示需要改变此存的图像,第二个参数改 ...