登陆注册
31848700000014

第14章 PL/SQL编程基础(1)

6.1 PL/SQL的简介

PL/SQL(Procedure Language and SQL)是Oracle对SQL的一种扩充,它集成了程序化设计语言中的许多特性。SQL是一种存取Oracle数据库的语言,PL/SQL则将SQL的强大性和灵活性与过程化语言的过程性融为一体。PL/SQL通过增加在其他过程化语言中的结构来对SQL进行扩充,所以PL/SQL既具有对数据库存取功能比较强的特点,可以使用SQL语句中的查询语句和数据操纵语句对数据库进行操作,又具有过程化语言的条件判断、循环、出错处理等特点。PL/SQL是一个强大的事务处理语言,支持SQL中的DML语句及TCL语句(事务控制语句),但不支持DDL语句和DCL语句,不过可以使用Oracle内置包DBMSSQL执行DDL语句和DCL语句。

PL/SQL将Oracle服务器与其他工具结合起来,可以从各种工具和各种环境中访问Oracle数据库。PL/SQL不是一个独立的产品,而是嵌入在Oracle服务器和Oracle开发工具中的,所以在Oracle客户端的各种工具和服务器中都可以编写PL/SQL程序。

6.1.1 PL/SQL的优点

PL/SQL具备SQL的功能和SQL语言所不具备的过程化功能,主要优点如下。

过程化和模块化:将逻辑上相关的语句组织在一个PL/SQL程序块中。

使用过程化语言的控制结构:可以有条件地执行一系列语句、可以重复地执行一系列语句、使用显式游标处理多行查询返回结果中的每一行。

错误处理:使用EXCEPTION处理语句处理服务器的错误和用户自定义的错误。

可移植性:可以将程序移植到任何支持Oracle和PL/SQL的主机环境中。

集成:通过PL/SQL可以将前台和后台技术结合起来。

改善性能:PL/SQL可以改善一个应用的性能、减少网络的流量。

6.1.2 PL/SQL的特点

PL/SQL是一种高性能的事务处理语言,支持所有的事务控制命令(如:COMMIT、ROLLBACK等命令)。

可移植到任何Oracle的环境中,并且支持所有SQL数据操纵命令(如:SELECT、DELETE、UPDATE、INSERT等命令)。

使用Oracle所提供的特殊的PL/SQL程序包DBMSSQL可以处理SQL的DDL命令(如:CREATE、DROP、ALTER等命令)和DCL命令(如:GRANT、REVOKE等命令)。

PL/SQL支持所有SQL数据类型(如:NUMBER、VARCHAR2、DATE等类型)、SQL函数(如:SUBSTR、NEXTDAY、ROUND等函数)和各种运算符(如:IN、BETWEEN AND、LIKE等运算符)。

PL/SQL块可以被命名并存储在Oracle 服务器中,可以在另一个PL/SQL程序或SQL命令行中被存取和重用。

存储在服务器上的PL/SQL程序的安全性可以使用授权和回收权限进行管理。

注意:在PL/SQL中使用SELECT 语句的语法与标准SQL中的SELECT 语法有区别。其他PL/SQL所支持的SQL命令在标准SQL和PL/SQL中则没有区别。

标准SQL中的SELECT语法如下:

SELECT 列名,列名……

FROM 表

WHERE 条件……

而在PL/SQL中的SELECT 语法为:

SELECT 列名,列名……

INTO 变量1,变量2……

FROM 表

WHERE 条件……;

6.1.3 如何编写和编译PL/SQL程序块

因为PL/SQL是嵌入在Oracle服务器和Oracle开发工具中的,所以在Oracle客户端的各种工具和服务器中都可以编写PL/SQL程序。在客户端的PL/SQL Developer Tool开发工具、Developer6i开发工具或SQL*Plus工具中都可以编写PL/SQL块,在服务器端的PL/SQL DeveloperTool开发工具或SQL*Plus工具中也可以编写PL/SQL块。

以SQL*Plus工具为例,举例说明如何编写、编译和运行PL/SQL程序块,步骤如下:

启动SQL*Plus工具。单击“开始”→“程序”→“Oracle-OraHome92”→“Application Development”→“SQL Plus”,启动SQL*Plus工具,弹出登录窗口,要求输入用户名、口令和连接字符串。输入用户名为scott,口令为tiger,连接字符串是第4章介绍的网络服务名,输入ORCL1。此时出现SQL>提示符,表示SQL*Plus工具已连接到Oracle数据库。

在SQL>提示符下输入下列语句:

SQL>edit c:\plsqlblock1.sql

表示在C盘的根目录下编辑一个脚本文件plsqlblock1.sql,此时弹出一个窗口,询问此文件不存在,是否要建立一个新文件,选择“是”,系统启动记事本编辑此文件。

在记事本的编辑窗口中输入PL/SQL块的语句(PL/SQL块结构参见6.2.1.1节),在END结束符的下一行开头加“/”作为结束标志。

在记事本的编辑窗口中保存刚输入的PL/SQL块的语句,关闭该编辑窗口。

回到SQL>提示符,在该提示符下输入下列命令:

SQL>SET serveroutput ON

SQL>START c:\plsqlblock1.sql

首先激活dbmsoutput包,以便在PL/SQL块中可以引用dbmsoutput包将变量的值输出在屏幕上,接着编译和运行该PL/SQL块,查看该块是否有语法错误和逻辑错误。

如果显示已成功运行的提示信息,说明上述PL/SQL块没有语法错误。可以将PL/SQL块的运行结果输出,或以别的形式验证块是否有逻辑错误。如果显示编译有错,应该检查PL/SQL块的语句和语法,然后重新编译,直到编译成功为止。

6.2 PL/SQL 程序结构

6.2.1 块结构

PL/SQL是块结构化的语言。组成一个PL/SQL程序的单元是逻辑块(BLOCK)。PL/SQL程序由一个或多个块组成。这些块可以顺序出现、也可以相互嵌套。

6.2.1.1 块的基本结构

每一个块分成三部分,其基本结构如下:

[DECLARE]

——说明部分(可选的)

BEGIN

——语句执行部分(必需的)

[EXCEPTION]

——出错处理程序(可选的)

END;

/

其中:只有语句执行部分是必需的,其他两部分都是可选的。

说明部分包含在块的可执行部分中要用到的所有变量、常量、数据类型、游标和用户定义的错误等对象的定义。以关键字DECLARE开始,所有对象在使用之前必须定义。假如不需要定义变量等,可省略这部分。

执行部分是PL/SQL块中必需的,定义块要完成的处理工作。以关键字BEGIN开始。可以包含操作数据库数据的SQL语句和操作块中数据的PL/SQL语句。

出错处理部分是一个可选部分,指定在执行部分中发生了错误和非正常条件时执行的动作。定义了对各种错误的处理方法,由可执行语句去处理每一个错误。

注意:各部分的关键字DECLARE、BEGIN、EXCEPTION不必用分号(;)结束,而END和所有其他的PL/SQL语句都要求以分号(;)结束。分号(;)是PL/SQL中语句的分界符。一行的注释可以用两个连接符(——)开头,一段语句的注释用/*和*/包围。

6.2.1.2 嵌套块结构

PL/SQL块中可以包含子块,子块可位于PL/SQL块中的任何部分。子块也可是一条PL/SQL命令。

例6-1 举例说明块的嵌套结构。

[DECLARE]

……/*说明部分*/

BEGIN

……/*主块的语句执行部分*/

BEGIN

……/*子块的语句执行部分*/

[EXCEPTION]

……/*子块的出错处理程序*/

END

[EXCEPTION]

……/*主块的出错处理程序*/

END

同类推荐
  • 无人机:知道这些就够了

    无人机:知道这些就够了

    不久的将来无人机将像智能手机一样司空见惯,而你对无人机的了解有多少?你知道无人机有哪些用途吗?无人机对你和你的家庭又会产生什么样的影响呢?知道这些就够了。
  • 虚拟现实:下一个产业浪潮之巅(第2版)

    虚拟现实:下一个产业浪潮之巅(第2版)

    毫无疑问,虚拟现实时代已经来临,VR不仅将彻底改变人们交互的方式。而且会是互联网的下一个风口,VR会创造新时代,即由人的体验构成的互联网时代。目前,全球范围众多的科技、影视等商业巨头纷纷砸巨资押注VR产业。例如,扎克伯格越来越坚定地认为,VR将会成为下一代计算机平台;任正非在内部讲话中也提到,华为要保持理性地进行VR投入与研究,要在这个充满诱惑的领域里分得一杯羹,谁最后倒下,谁便赢得天下。本书是作者基于VR行业多年的研究以及创立VR公司的经验写成,目的是让读者快速、全面地了解VR产业最新、最重要的信息,如生态链、技术瓶颈、发展前景以及人才结构等,是一部不可多得的VR行业入门读物。
  • 网络知识

    网络知识

    一般地说,将分散的多台计算机、终端和外部设备用通信线路互联起来,彼此间实现互相通信,并且计算机的硬件、软件和数据资源大家都可以共同使用,实现资源共享的整个系统就是计算机网络。
热门推荐
  • 异界天灵大陆

    异界天灵大陆

    龙凯第6本小说,是一个分歧点,龙凯有四个分歧作品,一个异界天灵大陆,一个泰拉瑞亚之四神守护者,一个守望先锋之生存大逃杀,一个我的世界之生活大冒险,一个我是海贼王,如果收不到就是因为龙凯没有发表,可以看别的。
  • 枪神特遣队

    枪神特遣队

    某一天,星际的深处,驶来了一艘飞船,他们与人类无异,但却拥有着超人类科技。他们口气狂妄,扑头就是一句:“臣服我们!”这一天,世纪开始更替,文明逐渐碰撞,地球面临着新的时代!一切,已经迫在眉睫!
  • 去追寻

    去追寻

    我追寻着他,他追寻着别人,我带着辛酸,他带着幸福......
  • 从将夜开始的万界之旅

    从将夜开始的万界之旅

    这里是将夜的世界,与天斗,其乐无穷;破天而去,万界之始
  • 多元世界管理员

    多元世界管理员

    我踏过寒冷的冰河时代,我见过传说中的神明陨落。也曾听闻古老者的低语。世界似乎在这里只是一个概念………那些未完成的约定我不会一一去守护,那些未完成的任务我更想逃离此处。无敌文放心看吧
  • 关于转生成魔法少女的非日常

    关于转生成魔法少女的非日常

    一生朝着人生巅峰走的天才少女没想到一朝重生魔法大陆就直达巅峰,什么巅峰不巅峰的不重要,重要的是这一世有人宠有人爱只想当一只混吃等死的咸鱼怎么办?什么天降重任于斯人也?不不不,我只是个默默无闻的魔法少女而已啦!
  • 纯白友谊请勿打扰

    纯白友谊请勿打扰

    曾有那么一个时代,对一个人好的方式,就是能送她喜欢的东西,不管她愿意不愿意
  • 喜欢你,没理由

    喜欢你,没理由

    “陌沫,我爱你,嫁给我,这一世你只能是我夜冥的人”“嗯,一生一世一双人,521”“321”“1314”两人之语。喜欢他,不需要太多理由,爱就是爱,可事情往往不会那么顺利,只有经历过磨难的爱,才会幸福。第一次写书多多关照
  • 好吃懒做:芊芊的米虫生活

    好吃懒做:芊芊的米虫生活

    她穿越回古代,只想过吃喝不愁泡泡美男的米虫生活啊。但府里心思各异的众人,复杂关系错综皇室子弟,一不小心就卷进了宫庭之争,盘桓在各色美男中间,且看她怎么化解一串串麻烦,迎来自己的幸福人生。最搞笑最轻松最快意人生的古代大小姐奋斗记。
  • 陌路:绝世逆天小姐

    陌路:绝世逆天小姐

    因为你,我放弃杀戮,无怨无悔。为了你,我蹈锋饮血,在所不惜。一个是在朝廷高高在上的秦王,一个是在江湖杀人嗜血的阁主。本该毫无交集的两人,因为一场偶遇,开启了一场虐缘……两重身份,两种情感,且看他们如何在相爱相杀,如何……