PL SQL语言基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_ben/article/details/83269885

PL/SQL语言简介

PL/SQL概述

PL/SQL是Oracle在标准SQL语言上的过程性扩展,它允许嵌入SQL语句、定义变量和常量、使用过程语言结构(条件分支和循环语句)、使用异常来处理Oracle错误等。在任何运行Oracle的平台上,应用开发人员都可以使用PL/SQL。通过使用PL/SQL,可以在一个PL/SQL快中包含多条SQL语句和PL/SQL语句。PL/SQL可以用于创建存储过程、触发器和程序包等,也可以用于处理业务规则、数据库时间成为SQL命令的执行添加程序逻辑。

PL/SQL优点

PL/SQL是一种可移植的高性能事务处理程序,它支持SQL和面向对象编程,提供了良好的性能和高效处理能力,具有以下6个方面的优点。
⑴ 提高了应用程序的运行性能
在编写Oracle数据库应用程序时,开发人员可以直接将PL/SQL块内嵌到应用程序中,其最大的优点是可以降低网络开销、提高应用程序性能。对于其他异构数据库(例如SQL Server、Sybase、DB2等),当应用程序访问RDBMS时,每次只能发送单条SQL语句。而对于Oracle数据库而言,通过使用PL/SQL块,可以将多条SQL语句组织到同一个PL/SQL块中,从而降低了网络开销,提高应用程序的性能。
⑵ 提供模块化的程序设计功能
当开发数据库应用程序时,为了简化客户端应用程序的开发和维护工作,可以首先将企业规划或商业逻辑集成到PL/SQL子程序(过程、函数和包)中,然后在应用程序中调用子程序实现相应的程序功能。
⑶ 允许定义标识符
当使用PL/SQL开发应用模块时,为了使应用模块与应用环境实现数据交互,需要定义变量、常量、游标等各种标识符。例如,函数get_sal中的no为输入参数,用于接收雇员编号的输入值,而salary变量则用于临时存储雇员工资。
⑷ 具有过程语言控制结构
PL/SQL是Oracle在标准SQL上的过程性扩展,它不仅允许在PL/SQL块中嵌入SQL语句,而且允许在PL/SQL块中使用各种类型的条件分支语句和循坏语句。
⑸ 具有良好的兼容性
PL/SQL是Oracle提供的用于实现应用模块的语言,在允许运行Oracle的任何平台上都可以使用PL/SQL。例如,在Oracle数据库中使用PL/SQL开发数据库端的过程、函数和触发器,以及在Oracle提供的应用开发工具Developer中使用PL/SQL开发客户端的过程、函数和触发器。
⑹ 处理运行错误
当设计并开发应用程序时,为了提高应用程序的健壮性,可以使用PL/SQL提供的异常处理(EXCEPTION)集中处理各种Oracle错误和PL/SQL错误,从而简化错误处理。

PL/SQL块

所有的PL/SQL程序都以块作为基本单位组成。块中包含过程化语句和SQL的DML语句。这些块可以按顺序出现,也可以互相嵌套(一个块在另一个块的内部)。按是否带有名称以及在数据库中的存储方式,块可以分为以下5种。
⑴ 匿名块
匿名块是出现在应用程序中没有名称且不存储到数据库中的块。匿名块可以出现在SQL语句出现的地方,它们可以调用其他程序,却不能被其他程序调用。
⑵ 命名块
命名块是一种带有标签的匿名块,标签为块指定了一个名称。
⑶ 子程序
子程序是存储在数据库中的过程(procedure)、函数(function),生成之后可以被多次执行。
⑷ 程序包
程序包是存储在数据库中的一组子程序、变量定义。程序包中的子程序可以被其他程序包或子程序调用。如果声明为局部子程序,则只能在定义该局部子程序的块中被调用该局部子程序。
⑸ 触发器
触发器是一种存储在数据库中的命名块,生成之后可以被多次执行。在相应的触发器事件发生之前或之后就会被执行一次或多次(每行记录一次)。触发器事件一般是指对特定的数据库表、视图进行的操作,如INSERT、 UPDATE 和 DELETE等(称为DML触发器),或者对数据库级的操作,如关闭、启动、登录、退出数据库、创建对象、修改对象、删除对象等(称为系统触发器)。


程序结构

组成部分

PL/SQL程序块由3个部分组成:定义部分、执行部分和异常处理部分。其中,定义部分用于定义常量、变量、游标、异常和复杂数据等;执行部分用于实现应用模块功能,该部分包含需要执行的PL/SQL语句和SQL语句;异常处理部分用于处理执行部分可能出现的运行错误。PL/SQL块的基本结构如下:

DECLARE
 定义部分
BEGIN
   执行部分
EXCEPTION
   异常处理部分
END;

其中,定义部分以 DECLARE 开始,该部分是可选的;执行部分已BEGIN开始,该部分是必须的;异常处理部分已EXCEPTION开始,该部分是可选的;END则是PL/SQL程序块的结束标记。

PL/SQL注释

在PL/SQL程序中加入注释可以帮助理解程序,PL/SQL编译器在编译时会忽略掉注释。
⑴ 单行注释
由两条短横线(--)开始,直到该行的最后。
⑵ 多行注释
由“/*”开始,“*/”结束,可以跨越多行,但不允许嵌套。

常量和变量

在声明部分中可以声明需要使用的常量、变量、函数、游标、异常处理名称等。
⑴ 声明
声明常量、变量的语法如下:

identidier_name [CONSTANT] data_type [NOT NULL]
[:= value_expression] | [DEFAULT value_expression]

其中,identidier_name 指定需要声明的常量、变量的名称;data_type 指定数据类型;“:=” 是赋值运算符(或使用DEFAULT);value_expression是赋值表达式。如果语句中有 CONSTANT,则表明声明的是一个常量;如果有 NOT NULL ,则表明声明的变量不能为空(即在声明时必须赋值)。声明变量时应该立即赋值,如果没有赋值则表示初始化为NULL。
注意:在PL/SQL中,每一行能声明一个常量或变量。在引用一个常量或变量之前,必须先对其进行声明。
⑵ 使用SELECT INTO 语句为变量赋值
除了可以使用常量为变量赋值之外,还可以将从数据库表中查询获得的值赋给变量。通过 SELECT INTO 语句可以从数据库表中查询的结果赋予变量。

数据类型

编写PL/SQL程序时,若临时存储数值,则必须定义变量和常量;若在应用环境和子程序之间传递数据,则必须为子程序指定参数。而在PL/SQL程序中定义变量、常量和参数时,必须为它们指定PL/SQL数据类型。
⑴ CHAR
CHAR 表示固定长度字符串,长度不够时使用空格来补充,最多可以存储2000字节。
⑵ VARCHAR2
VARCHAR2表示可变长度字符串,最多可存储4000字节。
⑶ NUMBER
NUMBER类型可以存储正数、负数、零、定点数和精度为38位的浮点数。其格式为:NUMBER(M,N)
其中,M表示精度,代表数字的总位数;N表示小数点右边数字的位数。
⑷ DATE类型
DATE 数据类型用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31分。DATA类型的长度是7,7个字节分别表示世纪、年、月、日、时、分、秒。
⑸ TIMESTAMP类型
TIMESTAMP数据类型用于存储日期的年、月、日、小时、分和秒值。其中,秒值精确到小数点后6位,该数据类型同时包含时区信息。
⑹ CLOB 大字符串对象类型
CLOB数据类型用于存储可变长度的字符数据,最多可存储4GB。该数据类型用于存储VAECHAR2类型不能存储的长文本信息。
⑺ BLOB大二进制类型
BLOB数据类型用于存储较大的二进制对象,如图形、视频剪辑和声音剪辑等,该类型最多可以存储4GB数据。
⑻ %TYPE
当运行PL/SQL变量存放值时,必须确保变量使用合适的数据类型和长度,否则可能在运行过程中出现PL/SQL运行错误。此时,可以使用%TYPE属性来定义变量。当使用%TYPE属性定义变量时,Oracle会自动的按照数据库列或其他变量来确定新变量的类型和长度。
⑼ %ROWTYPE
如果一张表中包含较多的列,则可以使用%ROWTYPE来定义一个表示表中一行记录的变量,这样比分别使用%TYPE来定义表示表中各个列的变量更加简洁。
⑽ RECORD
PL/SQL记录类似于高级语言中的结构,每个PL/SQL记录一般都包含多个成员。当使用PL/SQL记录时,首先需要在定义部分定义记录类型和记录变量,然后在执行部分引用该记录变量。当引用记录成员时,必须将记录变量作为前缀,格式为:记录变量.记录成员
语法:

TYPE record_name IS RECORD
(
  v1 data_type1 [NOT NULL] [:=default_value]
  v2 data_type1 [NOT NULL] [:=default_value]
  vn data_type1 [NOT NULL] [:=default_value]
 );

⑽ TABLE
索引表相当于一个键值集合,键是唯一的,用于查找对应的值。键可以是整数或字符串。
语法:

TYPE table_name IS TABLE OF element_type [NOT NULL]
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2]

关键字 INDEX BY 表示创建一个主键索引,以便引用记录表变量中的特定行。
⑿ VARRAY
VARRAY 数组是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY。
语法:

TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];

上述语法中,varray_name是VARRAY数据类型的名称,size指定可以容纳成员的最大数量,element_type是指每个成员的数据类型。
注意:
对于VARRAY数据类型而言,首先应进行的3个步骤是定义、声明。初始化。这3个步骤缺一不可,否则就会在后面的使用过程中出错。在引用VARRAY数组中的成员时,需要在一对括号中使用顺序下标,下标从1开始。


流程控制

流程控制是PL/SQL对SQL最重要的扩展,流程控制结构包括条件控制、循环控制和顺序控制。

条件控制

◇ IF...THEN...END IF结构
最简单的条件控制结构。
语法:

IF 条件表达式 THEN
    语句段
END IF;

◇ IF…THEN…ELSE…END IF结构
二重条件分支结构。如果满足条件则执行一组操作,不满足条件则执行另外一组操作。
语法:

IF 条件表达式 THEN
    语句段1
ELSE
    语句段2
END IF;

◇ IF…THEN…ELSIE…END IF结构
多重条件分支结构。如果满足第一个条件,则执行第一种操作;如果不满足第一个条件,则检查是否满足第二个条件。如果满足则执行第二种操作;如果不满足第二个条件,则检查是否满足第三个条件……以此类推。
语法:

IF 条件表达式1 THEN
    语句段1
ELSIE 条件表达式2 THEN
    语句段2
ELSIE 条件表达式3 THEN
    语句段3
......
ELSIE 条件表达式n THEN
    语句段n
END IF;

◇ CASE结构
CASE结构是在Oracle 9i 中引入的另一种逻辑判断结构,它提供了另一种逻辑判断的实现方法。
语法:

CASE 表达式
 WHEN 条件表达式结果1 THEN
     语句段1;
 WHEN 条件表达式结果2 THEN
     语句段2;
     ......
 ELSE
     语句段n;
END CASE;    

CASE 结构的另一种语法格式被称为CASE搜索结构,语法如下:

CASE 
 WHEN 条件表达式结果1 THEN
     语句段1;
 WHEN 条件表达式结果2 THEN
     语句段2;
     ......
 ELSE
     语句段n;
END CASE;    

其中,CASE结构非常适用于从多个值中选择一个,以决定需要执行的语句段。在实际应用中,CASE结构的可读性和有效想更高,尽量将很长的IF…THEN…ELSIE…END IF结构 改写成CASE结构。

循环控制

为了在编写的PL/SQL块中重复执行一条语句或者一组语句,可以使用循环控制结构。编写循环控制结构时,用户可以使用基本循环、WHILE循环和FOR循环等类型的循环语句。
◇ 基本循环
在PL/SQL中,格式最简单的循环语句是基本循环语句,它以LOOP开始,以END LOOP结束。
语法:

LOOP
  语句段;
 EXIT [WHEN 条件表达式]
END LOOP;

上述语法中,当使用基本循环时,无论是否满足条件,语句至少会被执行一次。当条件表达式为TRUE时,会推出循环,并执行END LOOP后的操作。
注意:EXIT 语句必须放在循环体内,且只能退出循环体,不能退出PL/SQL块。当需要退出PL/SQL块时,应该使用RETURN语句。

◇ WHILE 循环
基本循环至少需要执行一次循环体内的语句,而WHILE循环中,只要当条件为TUER时,才会执行循环体内的语句。
语法:

WHILE 条件表达式 LOOP
    语句段;
END LOOP;

◇ FOR 循环
当使用基本循环或WHILE循环时,需要定义循环控制变量。循环控制变量不均可以使用NUMBER类型,还可以使用其他数据类型。当使用FOR循环时,Oracle会隐含定义循环变量。
语法:

FOR 循环变量 in [REVERSE] 初始表达式.. 终值表达式 LOOP
   语句段
END LOOP;

默认情况下,当使用FOR循环时,每次循环时控制变量会自动增加1;如果指定了REVERSE选项,则每次循环时循环变量会自动减少1。在循环体内部可以引用循环变量,但不能对赋值。

顺序控制

PL/SQL 不仅提供了条件分支语句和循环控制语句,还提供了顺序控制语句GOTO和NULL。
◇ GOTO 语句
GOTO 语句用于跳转到特定标号处去执行语句。使用GOTO 语句会增加程序的复杂性,并使应用程序可读性变差,所以在开发应用时不建议使用GOTO 语句。
◇ NULL 语句
NULL 语句不会执行任何操作,并直接将控制传递到下一条语句。使用 NULL 语句的优点在于可以提高PL/SQL程序的可读性。


异常处理

PL/SQL异常是指通过了编译的PL/SQL程序在运行时产生的错误。导致异常的原因较多,如内存用尽、硬件故障、违反表的完整性约束、设计缺陷等。PL/SQL提供了异常错误处理机制,可以帮助实现对错误的捕获和处理。当异常发生时,PL/SQL会自动的捕获异常并将程序控制流程转移到异常处理部分的程序。
语法:

EXCEPTION
   WHEN 异常错误名称1 [OR 异常错误名称2......] THEN
       语句段1;
   WHEN 异常错误名称3 [OR 异常错误名称4......] THEN
       语句段2;
       ......
   WHEN OTHERS THEN
       语句段3;
       

上述语法中,异常处理部分以保留字 EXCEPTION 开始,可以使用 WHEN 子句按“异常错误名称”捕获各种异常错误,其他没有预计到的异常错误可以使用 WHEN OTHERS 子句进行捕获。

预定义异常

针对一些常见的错误,PL/SQL预定义了一些异常错误。当PL/SQL程序违反了Oracle的规定或超出了系统规定的限制时,就会隐含的引发一个预定义的错误。PL/SQL在程序包STANDARD中包含了这些预定义异常,常见的预定义异常错误见下图:

在这里插入图片描述

自定义异常

预定义异常都是由Oracle判断的异常错误。在实际的PL/SQL程序开发过程中,为了具体的业务规则、编程和调试的需要,程序员可以自定义一些异常。自定义异常必须进行声明,并且必须使用RAISE语句显式的触发。
在更新表中的数据时,如果没有符合条件的记录,则不会更新数据。因为这不是错误,所以不会有任何的错误提示,但可以使用自定义错误异常的方法来提示。

猜你喜欢

转载自blog.csdn.net/My_ben/article/details/83269885