可以将复杂的问题拆分成小的容易解决的子程序,可以在多个应用程序中复用。
1.1.1.1 错误处理
PL/SQL使得检测和处理错误非常容易。当错误发生时,PL/SQL产生一个异常。正常的执行停止,控制转向PL/SQL块的异常处理部分。你不需要每个操作来确保它成功,就像在C程序中一样。
1.1.1.2 块
PL/SQL源代码的基本单位是块。它把相关的声明和语句组织到一起。
一个PL/SQL块由下面的关键字来定义:
declare
begin
exception
end;
一个PL/SQL由3部分组成:声明部分,执行部分,异常处理部分。只有执行部分是必须的。
块中还可以包括标签。
<< label >> (可选的)
declare --声明部分(可选)
-- 本地变量、类型和子程序的声明
begin -- 执行部分(必须的)
-- 语句 (可以使用声明部分的成员)
exception -- 异常处理部分(可选)
-- 对于执行部分产生的异常进行处理
end;
声明部分对于块是本地可见的,块执行结束后就消失了,用于帮助避免变量和子程序的杂乱的命名空间。
块可以嵌套。因为块是一个可执行的声明,所以它可以出现在其它块中可执行语句出现的地方。
可以把块提交给交互式工具(如SQL*Plus或Enterprise Manager)或把它嵌入到Oracle预编译程序或OCI程序中。然后交互式工具或程序运行块一次。块不被存储到数据库中,因此这种块被称为匿名块(即使它有标签)。注意:一个匿名块是一个SQL语句。
匿名块每次都被编译并被加载到内存,它的编译过程有3个阶段:
n 语法检查:PL/SQL语法被检查,解析树被生成。
n 语义检查:类型检查并进一步处理解析树。
n 生成代码。
1.1.1.3 变量和常量
可以定义常量和变量。在程序运行时变量的值可以改变,而常量不可以。
1.1.1.4 子程序
PL/SQL子程序是一个可以被重复调用的命名块。如果子程序有参数,每次调用时参数可以不同。
PL/SQL有2种类型的子程序:过程和函数。函数有返回值。
PL/SQL也可以调用使用其它语言书写的外部程序。
1.1.1.5 包
包是一个方案对象,用于在逻辑上组织相关的类型、变量、常量、子程序、光标和异常。包被编译并存储在数据库中,多个应用程序可以共享它的内容。可以把包看作是一个应用程序。
可以书写自己的包,也可以使用Oracle提供的许多特定包。
1.1.1.6 触发器
触发器是命名的PL/SQL单元,存储在数据库中,并在数据库事件发生时做为响应而运行。
可以指定事件、在事件之前还是之后触发、是每事件运行一次还是每行运行一次。
1.1.1.7 输入输出
大多数的PL/SQL输入、输出都是通过SQL语句来完成,这些SQL语句在数据库表中存储数据或查询这些表。
所有其它的PL/SQL I/O都是通过下面的包来完成的。
dbms_output
让PL/SQL块、包、子程序、触发器输出。尤其是输出PL/SQL调试信息。
htf
超文本函数,产生HTML标签(例,htf.anchor产生标签)
htp
超文本过程,产生HTML标签
dbms_pipe
允许相同实例中的2个或多个会话进行通信
utl_file
读写操作系统文件
utl_http
进行HTTP协议调用,和通过HTTP协议访问internet上的数据。
utl_smtp
通过RFC821描述的SMTP协议发送电子邮件
如果想显示传递给dbms_output的输出,需要其它的程序,例如SQL*Plus,需要设置SQL*Plus参数set serveroutput on
上表包中的这些子程序可以接受输入和显示输出,但他们不能从键盘直接接受数据。
为了从键盘直接接受数据,需要使用SQL*Plus中的prompt和accept命令。
1.1.1.8 数据抽象
使用数据抽象可以让你工作于数据的主要属性,而不必卷入到细节之中。可以先定义数据结构,然后设计算法来操作它。
(1)光标
光标是指向私有SQL区的一个指针,SQL区域存储关于处理特定的SQL语句或PL/SQL的select into语句的信息。可以使用光标一次取得结果集中的行。可以使用光标属性获得光标的状态,例,SQL语句影响了多少行。
(2)复合变量
复合变量拥有内部成员,可以单独访问。可以把复合变量作为参数整体传递给子程序。PL/SQL有2种类型的复合变量:集合和记录。在集合中,所有的内部成员都是相同类型被称作元素。可以通过唯一的下标来访问每个元素。链表和数组是典型的集合;在记录中,内部成员可以有不同的类型,被称作域。通过名称访问每个域。一个记录变量可以用来保存表中的一行,表一行中的部分列。
(3)%rowtype属性
可以用来声明一个记录来表示表或视图一行或行的一部分。对于一行或一行的一部分的每个列,记录都有一个具有相同名称和类型的域。如果行的结构改变了,则记录的结构会相应的改变。
(4)%type属性
可以用来声明与先前声明的变量或列具有相同数据类型的数据元素,而不需要知道具体是什么类型。如果被引用的成员改变了,则声明的成员随之改变。该属性在声明变量保存数据库值的时候非常有用。
(5)抽象数据类型
抽象数据类型包含数据结构和处理数据的子程序。构成数据结构的变量称为属性。操作属性的子程序称为方法。
ADT被存储在数据库中,ADT的实例可以被存储在表中,作为PL/SQL变量来使用。
ADT可以通过将大的系统分割成可重用小的逻辑组件来降低复杂性。
在数据字典视图*_OBJECTS中object_type的值为type;在数据字典视图*_TYPES中TYPECODE的值是object。
1.1.1.9 控制语句
控制语句是PL/SQL对SQL最重要的扩展。
n 条件选择语句:根据不同的数据值运行不同的语句
n 循环语句:为一系列不同的值重复执行相同的语句
n 顺序控制语句:允许跳转到特定的标签语句,或什么都不做。
1.1.1.10 条件编译
条件编译允许在PL/SQL应用中自定义功能而不用移除源代码:
n 可以使用新版本中的新功能,而在老版本的数据库中运行应用时禁用。
n 在开发环境中激活调试和跟踪语句,当在生产性站点运行程序时隐藏他们。
1.1.1.11 一次一行处理查询结果集
PL/SQL允许执行一个SQL查询,并一次处理结果集中的一行。
begin
for someone in (select * from employees where employee_id < 120 order by employee_id)
loop
dbms_output.put_line('First name = ' || someone.first_name ||
', Last name = ' || someone.last_name);
end loop;
end;
1.1.2 PL/SQL架构
1.1.2.1 PL/SQL引擎
PL/SQL编译和运行时系统是一个引擎,用于编译和运行PL/SQL单元。引擎可以被安装在数据库中或应用程序开发工具中,例Oracle Forms。
在任何环境中,PL/SQL引擎接受有效的PL/SQL单元作为输入。该引擎运行过程语句,而将SQL语句发送给SQL引擎。
通常,数据库处理PL/SQL单元。当一个应用程序开发工具处理PL/SQL单元时,它把它传递给本地的PL/SQL引擎。如果PL/SQL单元不包含SQL语句,则本地引擎处理整个PL/SQL单元。如果应用程序开发工具可以受益于条件和循环控制,这是非常有用的。例,Oracle Form应用程序通常会使用SQL语句来测试输入域的值并进行简单的计算。通过使用PL/SQL而不是SQL,这些应用可以避免对数据库的调用。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-752660/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-752660/