顺序结构

按先后顺序

分支判断结构

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 编程

    标识符的规范 1.定义变量,用v_作为前缀 2.定义常量,用c_作为前缀 3.定义游标,用_cursor作为后缀 4.定义列外,用e_作为前缀 块(block) PL\SQL的程序基本单元 编写PL\ ...

  2. 【PL/SQL】 控制结构

    一.控制结构的作用和类型 1.作用:在PL/SQL块内部使用控制结构来更改程序的逻辑 2.类型:条件IF语句.CASE语句.循环语句 ①条件控制语句 类型: ·简单条件判断(IF-THEN) 语句: ...

  3. oracle pl sql注意问题,Oracle PL/SQL编写PL/SQL代码的注意事项

    (1)几个值得注意的关键字(2)变量常量赋值注意: ---------------------------------------------------------------------[@mor ...

  4. PL/Sql循序渐进全面学习教程(下)(ZT)

    课程一.声明变量    本课重点:    1.了解基本的PLSQL块和区域    2.描述变量在PLSQL中的重要性    3.区别PLSQL与非PLSQL变量    4.声明变量    5.执行PL ...

  5. Oracle PL/SQL入门之慨述

    一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言(4GL),其执行特点是非过程化,即不用 ...

  6. Oracle PL/SQL语言入门

    一.背景介绍 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方 ...

  7. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  8. PL/SQL 处理流程

    P249 -P254  oracle8i_9i数据库基础--查看本号百度文库 ***********PL/SQL 简介*************** 1.PL/SQL 是过程语言(Procedural ...

  9. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

最新文章

  1. Rabin-Karp算法 java_第 2 章 字符串
  2. save(),saveOrUpdate(),merge()的区别
  3. incompatible jvm_JVM垃圾回收回收算法详解
  4. (66)UART接口波特率是多少?以及异步采样时钟是多少频率?
  5. Intel VT-x 处于禁用解决方法
  6. php cmd 命令行参数,php获取命令行参数
  7. hibernate总结一
  8. ATL 中 USES_CONVERSION 的具体功能
  9. python etree创建xml_python-如何使用xml.etree.Element编写XML声明
  10. 关于iOS端引入Myscript 的爬坑过程(pod install error)
  11. mac数字键盘错乱_苹果本键盘按键错位错乱是为什么?
  12. 在Windows上使用Cygwin源码安装tig
  13. 六位不重复房间ID生成器,不使用Redis和额外数据结构
  14. 土方工程量计算表格excel_土石方计算电子表格
  15. Leetcode-至多包含两个不同字符的最长子串
  16. 友盟推送集成的常见问题
  17. 论文阅读:Graph Contrastive Learning with Augmentations
  18. (笔记)第一章:零基础入门深度学习
  19. Dicom 图像--像素值(灰度值)转为CT值
  20. 用遗传算法GA改进CloudSim自带的资源调度策略

热门文章

  1. Java-String类型的参数传递问题
  2. 凤凰涅槃:从 iBatis 到 MyBatis
  3. CentOS下开启配置端口转发
  4. 关于数据库隔离问题说明及解决
  5. 文件移到废纸篓,可是这个状态就卡住了
  6. mkdir: cannot create directory ‘/soft/hadoop-2.7.3/logs’: Permission denied问题
  7. eclipse launching workspace太慢的解决方法
  8. 类库,通用变量,is/as运算符,委托。
  9. 001 Cisco router prewired
  10. 42.Android之ListView中ArrayAdapter简单学习