第一章 Oracle PL/SQL开发基础---草稿

本文详细介绍了Oracle PL/SQL的基础知识,包括SQL标准、关系数据库设计范式以及PL/SQL的优势和基本结构。文章指出,SQL92是数据库的标准,而PL/SQL是Oracle对SQL的扩展,是数据库开发人员和DBA必须掌握的工具。通过范例展示了如何满足第二范式和第三范式,消除数据冗余和异常。此外,还概述了PL/SQL块的结构、命名和匿名块的区别,以及变量、常量、标量数据类型和控制结构的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章         基础知识

第一节 SQL标准

SQL92是数据库的一个ANSI/ISO标准

 这个标准的前身是SQL92 ANSI/ISO标准,而SQL92之前还有一个SQL89 ANSI/ISO标准。

它定义了一种语言(SQL)以及数据库的行为(事务、隔离级别等)。不同的商业数据库大部分符合SQL92的标准,但那小部分的差异往往是不同数据库自身的特点优势,也就这小部分会给移植带来无尽的烦恼。当然,如果开始后就可以避免使用具体数据库的特点可以很大程度上避免移植的工作量。还有就是使用ORM,也可很大程度减少移植的烦恼,但是ORM也有其自身的弱点,在后面章节会有详述。

 

SQL92标准定义四个层次

入门级

  几乎所有的开发商都支持。这一级只是对前一个标准SQL89稍做修改。所有数据库开发商都不会有更高的级别,实际上,美国国家标准和技术协会NISTNational Institute of Standards and Technology,这是一家专门检验SQL合规性的机构)除了验证入门级外,甚至不做其他的验证。Oracle 7.01993年通过了NISTSQL92入门级合规性验证。如果一个数据库符合入门级,它的特性集则是Oracle 7.0的一个功能子集。

过渡级

  这一级在特性集方面大致介于入门级和中间级之间。入门级标准不包括诸如外联结(outer join)、新的内联结(inner join)语法等特性,但在过渡级则指定了外联结语法和内联结语法。

中间级

  主要增加如下特性:

  动态SQL

  级联DELETE以保证引用完整性

  DATETIME数据类型

  域

  变长字符串

  CASE表达式

  数据类型之间的CAST函数

  完备级

  增加了以下特性(同样,这个列表也不完整):

  连接管理

  BIT串数据类型

  可延迟的完整性约束

  FROM子句中的导出表

  CHECK子句中的子查询

临时表

高级

中间级增加了更多的特性,完备级就是SQL92全部。有关SQL92的大多数书都没有区别这些级别,这就会带来混淆。这些书只是说明了一个完整实现SQL92的理论数据库会是什么样子。所以无论你拿起哪一本书,都无法将书中所学直接应用到任何SQL92数据库上。关键是,SQL92最多只达到入门级,如果使用了中间级或更高级里的特性,就存在难以“移植”应用的风险。

 

 

第二节 关系数据库设计范式

数据库表符合I,II,III范式的,目的是为了消除数据冗余、更新异常、插入异常和删除异常。如果这其中的某些要求可以容忍,也可以对某些表作一些改动以求更好的SQL操作性和性能,避免复杂的SQL技巧。

1. 范式介绍

1.1 第一范式(1NF)—— 无重复的列

  所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。

 

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

 

1.2 第二范式(2NF—— 属性完全依赖于主键,消除部分子函数依赖

 

      第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。

        第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。

 

1.3 第三范式(3NF—— 属性不依赖于其它非主属性,消除传递依赖

   满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

 

2. 范式应用实例剖析

下面以一个学校的学生系统为例分析说明,这几个范式的应用。首先第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话等信息。为了简单我们暂时只考虑这些字段信息。我们对于这些信息,说关心的问题有如下几个方面。

学生有那些基本信息

学生选了那些课,成绩是什么

每个课的学分是多少

学生属于那个系,系的基本信息是什么。

 

2. 范式例子

2.1 第二范式(2NF)实例分析

 

      首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。

        (学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话)

         (课程名称) (学分)

        (学号,课程)→ (学科成绩)

2.1.1 问题分析

 

      因此不满足第二范式的要求,会产生如下问题

        数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

        更新异常:

             1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

            2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

 

       删除异常 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

2.1.2 解决方案

 

      把选课关系表SelectCourse改为如下三个表:

学生:Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话)

课程:Course(课程名称, 学分)

选课关系:SelectCourse(学号, 课程名称, 成绩)

2.2 第三范式(3NF)实例分析

 

   接着看上面的学生表Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:

(学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话)

      但是还存在下面的决定关系

      (学号) (所在学院)(学院地点, 学院电话)

      即存在非关键字段"学院地点""学院电话"对关键字段"学号"的传递函数依赖。

        它也会存在数据冗余、更新异常、插入异常和删除异常的情况。 (數據的更新,刪除異常這里就不分析了,可以參照2.1.1進行分析)

 

        根据第三范式把学生关系表分为如下两个表就可以滿足第三范式了:

 

        学生:(学号, 姓名, 年龄, 性别,系别)

        系别:(系别, 系办地址、系办电话)

 

第三节  PL/SQL基础

  PL/SQLProcedural Language/SQL)是ORACLE公司对自身标准数据库语言的扩展,已经紧密整合到ORACLE 服务器和其他相关工具中,是数据库开发人员和DBA必须掌握的工具。一般的SQL数据库管理系统大多提供了类似的扩展SQL语言,例如SQL SERVERTransact-SQL, 功能也比较类似,但语法有明显的差异,所以用这些各自数据库专有语言编写的饿程序存在移植难得问题。但是不管什么扩展SQL语言,最终目的都是为了更方便,更强大,更好得使用自身的数据库。PL/SQL的的语法非常类似于Ada,而且像1980年代的Ada编译器一样,PL/SQL的运作系统使用Diana作为中介语言。本节将简述PL/SQL基本语法。PL/SQLOracle数据库支持的三种语言之一,另外两个则是SQLJava

 

1 PL/SQL介绍

 

  从版本6开始PL/SQL就被可靠的整合到ORACLE中了,PL/SQL已经被广泛得使用,数据库开发人员无法想象ORACLE没有 PL/SQL的日子。一旦掌握PL/SQL的优点以及其独有的数据管理的便利性。PL/SQL本身不算是一个独立的工具,它是被整合到ORACLE服务器和ORACLE工具中的技术,我们可以把它看作ORACLE服务器内嵌的一个SQL引擎。OralceSQL语句执行者处理单个的sql语句,而PL/SQL引擎处理PL/SQL程序块,可以看做PL/SQL是对一组SQL进行操作的内置工具。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理PL/SQL程序块中的SQL语句。

PL/SQL优势

n  PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

n  PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

n  PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

n  可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。

n   PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的

 如果我们用单独的一条条SQL来完成一组操作,ORACLE必须一条一条的接受处理。如果程序与数据库部署在不同的机器上,特别是在一定的网络环境下这就意味着每一次SQL操作,需要完成 程序发送,数据库接受处理然后返回,程序接收的过程,这样不仅占用大量的服务器时间,同时也导致网络拥塞。而PL/SQL是把整个语句块发给服务器,一次发送一组SQL,服务器处理完后只返回最终的结果,这就降低网路来回传输的性能损耗与网络拥挤。

 

2 PL/SQL块结构

  PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块。每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:  

 

声明部分(Declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

执行部分(Executable section)

执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。

异常处理部分(Exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

 

 

PL/SQL块语法

  [DECLARE]

  ---declaration statements

  BEGIN

  ---executable statements

  [EXCEPTION]

  ---exception statements

  END

 

PL/SQL块中的每一条语句都必须以分号(;)结束,一条SQL语句可以分布在多行,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间必须以分号分隔。 每一个PL/SQL块由BEGINDECLARE开始,以END结束。注释由 -- 标示。

 

3 PL/SQL块的命名和匿名

   PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

PL/SQL程序块可被独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:

n  . 函数

n  . 过程

n  .

n  . 触发器

3.1函数

函数是命名的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。函数的语法定义如下:

  FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS

  [local declarations]

  BEGIN

  execute statements

  [EXCEPTION

  exception handlers]

  END [name]

 

3.2过程

  存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUTE命令或PL/SQL程序块内部调用,存储过程的语法定义如下:

  PROCEDURE name [(parameter[,parameter,...])] IS

  [local declarations]

  BEGIN

  execute statements

  [EXCEPTION

  exception handlers ]

  END [name]

 

3.3(package)

  

包其实就是被组合在一起的相关对象的集合,当包中的任何函数或存储过程被调用时,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。

包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。包的定义如下:

 

CREATE [OR REPLACE] PACKAGE package_name

   [AUTHID {CURRENT_USER | DEFINER}]

   {IS | AS}

   [PRAGMA SERIALLY_REUSABLE;]

   [collection_type_definition ...]

   [record_type_definition ...]

   [subtype_definition ...]

   [collection_declaration ...]

   [constant_declaration ...]

   [exception_declaration ...]

   [object_declaration ...]

   [record_declaration ...]

   [variable_declaration ...]

   [cursor_spec ...]

   [function_spec ...]

   [procedure_spec ...]

   [call_spec ...]

   [PRAGMA RESTRICT_REFERENCES(assertions) ...]

END [package_name];

 

[CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}

   [PRAGMA SERIALLY_REUSABLE;]

   [collection_type_definition ...]

   [record_type_definition ...]

   [subtype_definition ...]

   [collection_declaration ...]

   [constant_declaration ...]

   [exception_declaration ...]

   [object_declaration ...]

   [record_declaration ...]

   [variable_declaration ...]

   [cursor_body ...]

   [function_spec ...]

   [procedure_spec ...]

   [call_spec ...]

[BEGIN

   sequence_of_statements]

END [package_name];]

 

3.4触发器(trigger)

触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发。触发器定义如下:

{CREATE | RECREATE | CREATE OR ALTER} TRIGGER name FOR {TABLE name | VIEW name}

 [ACTIVE | INACTIVE]

 {BEFORE | AFTER}

 {INSERT [OR UPDATE] [OR DELETE] | UPDATE [OR INSERT] [OR DELETE] | DELETE [OR UPDATE] [OR INSERT] }

 [POSITION n] AS

BEGIN

 .....

END

 

4 变量和常量

 

4.1变量存放在内存中以获得值,能被PL/SQL块引用。跟一般程序语言的变量没明显区别。 

 

声明变量

  变量一般都在PL/SQL块的声明部分声明,PL/SQL是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。

  声明变量的语法如下:

  Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]

  注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。

  给变量赋值

  给变量赋值有两种方式:

l  直接给变量赋值

X := 200;

           Y := Y+(X*20);

l  通过SQL SELECT INTO FETCH INTO给变量赋值

  SELECT SUM(SALARY),SUM(SALARY*0.1)

  INTO TOTAL_SALARY,TATAL_COMMISSION

  FROM EMPLOYEE

WHERE DEPT=10;

 

函数与过程的区别

 

 

4.2常量

  常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,他的声明方式与变量相似,但必须加上关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。

  ZERO_VALUE CONSTANT NUMBER:=0;

  这个语句定了一个名叫ZERO_VALUE、数据类型是NUMBER、值为0的常量。

4.3标量(scalar)

  数据类型

  标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:

  . number

  . character

  . date/time

. boolean

 

5 操作符

  与其他程序设计语言相同,PL/SQL有一系列操作符。操作符分为下面几类:

n  算术操作符

n  关系操作符

n  比较操作符

n  逻辑操作符

算术操作符如表4所示

**

乘方

/

+

*

-

 

 

 

关系操作符主要用于条件判断语句或用于where子串中,关系操作符检查条件和结果是否为truefalse,5PL/SQL中的关系操作符

小于操作符

<=

小于或等于操作符

大于操作符

>=

大于或等于操作符

=

等于操作符

!=

不等于操作符

 <>

不等于操作符

:=

赋值操作符

 

6 显示的是比较操作符

IS NULL

如果操作数为NULL返回TRUE

LIKE

比较字符串值

BETWEEN

验证值是否在范围之内

IN

验证操作数在设定的一系列值中

 

 

 

 

 

7.8显示的是逻辑操作符

AND

两个条件都必须满足

OR

只要满足两个条件中的一个

NOT

取反

 

 

 

  

6 执行部分

  执行部分包含了所有的语句和表达式,执行部分以关键BEGIN开始,以关键字EXCEPTION结束,如果EXCEPTION不存在,那么将以关键字END结束。分号分隔每一条语句,使用赋值操作符:=SELECT INTOFETCH INTO给每个变量赋值,执行部分的错误将在异常处理部分解决,在执行部分中可以使用另一个PL/SQL程序块,这种程序块被称为嵌套块

  所有的SQL数据操作语句都可以用于执行部分,PL/SQL块不能在屏幕上显示SELECT语句的输出。SELECT语句必须包括一个INTO子串或者是游标的一部分,执行部分使用的变量和常量必须首先在声明部分声明,执行部分必须至少包括一条可执行语句,NULL是一条合法的可执行语句,事物控制语句COMMITROLLBACK可以在执行部分使用,数据定义语言(Data Definition Language)不能在执行部分中使用,DDL语句与EXECUTE IMMEDIATE一起使用或者是DBMS_SQL调用。

 

  在SQL*PLUS中执行一个PL/SQL

SQL*PLUS中匿名的PL/SQL块的执行是在PL/SQL块后输入/来执行,如下面的例子所示:

  declare

  v_comm_percent constant number:=10;

  begin

  update emp

  set comm=sal*v_comm_percent

  where deptno=10;

  end

  SQL> /

  PL/SQL procedure successfully completed.

SQL>

 

  命名的程序与匿名程序的执行不同,执行命名的程序块必须使用execute关键字:

  create or replace procedure update_commission

  (v_dept in number,v_pervent in number default 10) is

  begin

  update emp

  set comm=sal*v_percent

  where deptno=v_dept;

  end

  SQL>/

  Procedure created

  SQL>execute update_commission(10,15);

  PL/SQL procedure successfully completed.

  SQL>

  如果在另一个命名程序块或匿名程序块中执行这个程序,那么就不需要EXECUTE关键字。

  declare

  v_dept number;

  begin

  select a.deptno

  into v_dept

  from emp a

  where job='PRESIDENT'

  update_commission(v_dept);

  end

  SQL>/

  PL/SQL procedure successfully completed

SQL>

 

7. 控制结构

控制结构控制PL/SQL程序执行流程,PL/SQL支持条件控制和循环控制结构。 主要是IF语句与循环语句。

7.1  IF语句

l  IF..THEN 语句

  语法:

  IF condition THEN

  Statements 1;

  Statements 2;

  ....

  END IF

  IF语句判断条件condition是否为TRUE,如果是,则执行THEN后面的语句,如果conditionfalseNULL则跳过THENEND IF之间的语句,执行END IF后面的语句。

l  IF..THEN...ELSE 语句

  语法:

  IF condition THEN

  Statements 1;

  Statements 2;

  ....

  ELSE

  Statements 1;

  Statements 2;

  ....

  END IF

  如果条件conditionTRUE,则执行THENELSE之间的语句,否则执行ELSEEND IF之间的语句。

l  IF语句嵌套  

IF 可以嵌套,可以在IF IF ..ELSE语句中使用IFIF..ELSE语句。

  if (a>b) and (a>c) then

  g:=a;

  else

  g:=b;

  if c>g then

  g:=c;

  end if

  end if

  IF..THEN..ELSIF

  语法:

  IF condition1 THEN

  statement1;

  ELSIF condition2 THEN

  statement2;

  ELSIF condition3 THEN

  statement3;

  ELSE

  statement4;

  END IF;

  statement5;

  如果条件condition1TRUE则执行statement1,然后执行statement5,否则判断condition2是否为TRUE,若为TRUE则执行statement2,然后执行statement5,对于condition3也是相同的,如果condition1condition2condition3都不成立,那么将执行statement4,然后执行statement5

  7.2循环控制

   循环控制的基本形式是LOOP语句,LOOPEND LOOP之间的语句将无限次的执行。LOOP语句的语法如下:

  LOOP

  statements;

  END LOOP

  LOOPEND LOOP之间的语句无限次的执行显然是不行的,那么在使用LOOP语句时必须使用EXIT语句,强制循环结束,例如:

  X:=100;

  LOOP

  X:=X+10;

  IF X>1000 THEN

  EXIT;

  END IF

  END LOOP;

  Y:=X;

  此时Y的值是1010.

  EXIT WHEN语句将结束循环,如果条件为TRUE,则结束循环。

  X:=100;

  LOOP

  X:=X+10;

  EXIT WHEN X>1000;

  X:=X+10;

  END LOOP;

  Y:=X;

  WHILE..LOOP

  WHILE..LOOP有一个条件与循环相联系,如果条件为TRUE,则执行循环体内的语句,如果结果为FALSE,则结束循环。

  X:=100;

  WHILE X<=1000 LOOP

  X:=X+10;

  END LOOP;

  Y=X;

  FOR...LOOP

  语法

  FOR counter IN [REVERSE] start_range....end_range LOOP

  statements;

  END LOOP;

  LOOPWHILE循环的循环次数都是不确定的,FOR循环的循环次数是固定的,counter是一个隐式声明的变量,他的初始值是start_range,第二个值是start_range+1,直到end_range,如果start_range等于end _range,那么循环将执行一次。如果使用了REVERSE关键字,那么范围将是一个降序。

  X:=100;

  FOR v_counter in 1..10 loop

  x:=x+10;

  end loop

  y:=x;

  如果要退出for循环可以使用EXIT语句。

  8.标签

  用户可以使用标签使程序获得更好的可读性。程序块或循环都可以被标记。标签的形式是<>

l  标记程序块

  <>

  [DECLARE]

  ... ... ...

  BEGIN

  ........

  [EXCEPTION]

  .......

  END label_name

l  标记循环

  <>

  LOOP

  .........

  <>

  loop

  ..........

  <>

  loop

  ....

  EXIT outer_loop WHEN v_condition=0;

  end loop innermost_loop;

  ..........

  END LOOP inner_loop;

END LOOP outer_loop;

 

  9.  GOTO语句

   语法:

  GOTO LABEL;

  执行GOTO语句时,控制会立即转到由标签标记的语句。PL/SQL中对GOTO语句有一些限制,对于块、循环、IF语句而言,从外层跳转到内层是非法的。

  X =100;

  FOR V_COUNTER IN 1..10 LOOP

  IF V_COUNTER =4 THEN

           GOTO end_of_loop

  END IF

           X:=X+10;

           < end_of_loop >

           NULL

  END LOOP

  Y:=X;

  注意:NULL是一个合法的可执行语句。

 10嵌套

  程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样GOTO语句不能由父块跳转到子块中,反之则是合法的。

  《OUTER BLOCK

  DECLARE

  A_NUMBER INTEGER

  B_NUMBER INTEGER

  BEGIN

  --A_NUMBER and B_NUMBER are available here

  <>

  DECLARE

  C_NUMBER INTEGER

  B_NUMBER NUMBER(20)

  BEGIN

  C_NUMBER:=A_NUMBER;

  C_NUMBER=OUTER_BLOCK.B_NUMBER;

  END SUB_BLOCK;

  END OUT_BLOCK;

 

-------------------------------------------------------------------------------------------------------------------------------

  以上简单介绍了PL/SQL的基础语法以及如何使用PL/SQL语言设计和运行PL/SQL程序块,并将PL/SQL程序整合到Oracle服务器中,虽然PL/SQL程序作为功能块嵌入Oracle数据库中,但PL/SQLORACLE数据库的紧密结合使得越来越多的Oracle数据库管理员和开发人员开始使用PL/SQL

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值