PL/SQL经典学习笔记(11-15)

可以将复杂的问题拆分成小的容易解决的子程序,可以在多个应用程序中复用。

1.1.1.1 错误处理

PL/SQL使得检测和处理错误非常容易。当错误发生时,PL/SQL产生一个异常。正常的执行停止,控制转向PL/SQL块的异常处理部分。你不需要每个操作来确保它成功,就像在C程序中一样。

1.1.1.2

PL/SQL源代码的基本单位是块。它把相关的声明和语句组织到一起。

一个PL/SQL块由下面的关键字来定义:

declare

begin

exception

end;

一个PL/SQL3部分组成:声明部分,执行部分,异常处理部分。只有执行部分是必须的。

块中还可以包括标签。

<< label >> (可选的)

declare                                                     --声明部分(可选)

    -- 本地变量、类型和子程序的声明

begin                                                       -- 执行部分(必须的)

    -- 语句 (可以使用声明部分的成员)

exception                                                   -- 异常处理部分(可选)

    -- 对于执行部分产生的异常进行处理

end;

声明部分对于块是本地可见的,块执行结束后就消失了,用于帮助避免变量和子程序的杂乱的命名空间。

块可以嵌套。因为块是一个可执行的声明,所以它可以出现在其它块中可执行语句出现的地方。

可以把块提交给交互式工具(如SQL*PlusEnterprise Manager)或把它嵌入到Oracle预编译程序或OCI程序中。然后交互式工具或程序运行块一次。块不被存储到数据库中,因此这种块被称为匿名块(即使它有标签)。注意:一个匿名块是一个SQL语句。

匿名块每次都被编译并被加载到内存,它的编译过程有3个阶段:

n  语法检查:PL/SQL语法被检查,解析树被生成。

n  语义检查:类型检查并进一步处理解析树。

n  生成代码。

1.1.1.3 变量和常量

可以定义常量和变量。在程序运行时变量的值可以改变,而常量不可以。

1.1.1.4 子程序

PL/SQL子程序是一个可以被重复调用的命名块。如果子程序有参数,每次调用时参数可以不同。

PL/SQL2种类型的子程序:过程和函数。函数有返回值。

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中的promptaccept命令。

1.1.1.8 数据抽象

使用数据抽象可以让你工作于数据的主要属性,而不必卷入到细节之中。可以先定义数据结构,然后设计算法来操作它。

1)光标

光标是指向私有SQL区的一个指针,SQL区域存储关于处理特定的SQL语句或PL/SQLselect into语句的信息。可以使用光标一次取得结果集中的行。可以使用光标属性获得光标的状态,例,SQL语句影响了多少行。

2)复合变量

复合变量拥有内部成员,可以单独访问。可以把复合变量作为参数整体传递给子程序。PL/SQL2种类型的复合变量:集合记录。在集合中,所有的内部成员都是相同类型被称作元素。可以通过唯一的下标来访问每个元素。链表和数组是典型的集合;在记录中,内部成员可以有不同的类型,被称作。通过名称访问每个域。一个记录变量可以用来保存表中的一行,表一行中的部分列。

3%rowtype属性

可以用来声明一个记录来表示表或视图一行或行的一部分。对于一行或一行的一部分的每个列,记录都有一个具有相同名称和类型的域。如果行的结构改变了,则记录的结构会相应的改变。

4%type属性

可以用来声明与先前声明的变量或列具有相同数据类型的数据元素,而不需要知道具体是什么类型。如果被引用的成员改变了,则声明的成员随之改变。该属性在声明变量保存数据库值的时候非常有用。

5)抽象数据类型

抽象数据类型包含数据结构和处理数据的子程序。构成数据结构的变量称为属性。操作属性的子程序称为方法

ADT被存储在数据库中,ADT的实例可以被存储在表中,作为PL/SQL变量来使用。

ADT可以通过将大的系统分割成可重用小的逻辑组件来降低复杂性。

在数据字典视图*_OBJECTSobject_type的值为type;在数据字典视图*_TYPESTYPECODE的值是object

1.1.1.9 控制语句

控制语句是PL/SQLSQL最重要的扩展。

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,这些应用可以避免对数据库的调用。

fj.png捕获.JPG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-752660/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-752660/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值