按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
SQL 21 日自学通(V1。0) 翻译人 笨猪
Input truncated to 1 characters
=======================
ERROR: Aborting program。
Unknown Pay Type for: JEFF JENNINGS
PL/SQL procedure successfully pleted。
分析
错误信息表明 JEFF JENNINGS 的薪金支付方式不是 HOURLY 和 SALARY 这就是异
常所捕获到的错误信息
存储过程 包和触发机制
使用 PL/SQL 你可以创建存储对象来代替日复一日的输入单调和枯燥的代码 过程
是一些可以执行一些特定类型的存储工作的代码块 相关的过程可以组合和存储在一起
这称为包 触发机制是一种在其它的事务中使用的数据库对象 你也许对一个叫 ORDERS
的表建立了一个触发机制以使得每次当 ORDERS 表接受到数据时都向 HISTORY 表中插入
数据 这些对象的基本语法如下
过程示例
语法
PROCEDURE procedure_name IS
variable1 datatype;
。。。
BEGIN
statement1;
。。。
EXCEPTION
when 。。。
END procedure_name;
405
…………………………………………………………Page 406……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
示例包
语法
CREATE PACKAGE package_name AS
PROCEDURE procedure1 (global_variable1 datatype; 。。。);
PROCEDURE procedure2 (global_variable1 datatype; 。。。);
END package_name;
CREATE PACKAGE BODY package_name AS
PROCEDURE procedure1 (global_variable1 datatype; 。。。) IS
BEGIN
statement1;
。。。
END procedure1;
PROCEDURE procedure2 (global_variable1 datatype; 。。。) IS
BEGIN
statement1;
。。。
END procedure2;
END package_name;
示例触发机制
SYNTAX:
CREATE TRIGGER trigger_name
AFTER UPDATE OF column ON table_name
FOR EACH ROW
BEGIN
statement1;
。。。
END;
406
…………………………………………………………Page 407……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
下边的例子在当对 PAY_TABLE 表的数据进行更新时使用触发机制向一个事务表中插
入数据 事务表如下所示
INPUT:
SQL》 describe trans_table
OUTPUT:
Name Null? Type
ACTION(10) VARCHAR2
NAME VARCHAR2(20)
PREV_PAY NUMBER(8;2)
CURR_PAY NUMBER(8;2)
EFF_DATE DATE
示例行的数据如下
输入/输出
SQL》 select * from pay_table where name = 'JEFF JENNINGS';
NAME PAY_TYPE PAY_RATE EFF_DATE PREV_PAY
JEFF JENNINGS WEEKLY 71。50 01…JAN…97
现在 创建一个触发机制
SQL》 CREATE TRIGGER pay_trigger
2 AFTER update on PAY_TABLE
3 FOR EACH ROW
4 BEGIN
5 insert into trans_table values
6 ('PAY CHANGE'; :new。name; :old。pay_rate;
7 :new。pay_rate; :new。eff_date);
8 END;
9 /
然后对 PAY_TABLE 进行更新操作 这会导致触发机制的运行
输入/输出
SQL》 update pay_table
2 set pay_rate = 15。50;
3 eff_date = sysdate
407
…………………………………………………………Page 408……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
4 where name = 'JEFF JENNINGS';
SQL》 select * from pay_table where name = 'JEFF JENNINGS';
NAME PAY_TYPE PAY_RATE EFF_DATE PREV_PAY
JEFF JENNINGS WEEKLY 15。50 20…MAY…97
SQL》 select * from trans_table
ACTION NAME PREV_PAY CURR_PAY EFF_DATE
PAY CHANGE JEFFJENNINGS 71。5 15。5 20…MAY…97
分析
在 PAY_TABE 表中的 PREV_PAY 中是空的 但是在 TRANS_TABLE 中则存在数值
你是不是糊涂了 PAY_TABLE 是不需要 PREV_PAY 的 因为每小时的薪金为 71。5 在这里
很明显是一个错误的数值 由于更新操作是一个事务 所以我们把 PREV_PAY 的数值插入
到了 TRANS_TABLE 表中 它的目的是为所以的用 PAY_TABLE 工作的表保存记录
注 如果你工作在类似的网络环境中 你也许会注意到 PL/SQL 与 JAVA 的存储过程有一
些类似 但是 你要注意到他们的不同之处 PL/SQL 是对标准的 SQL 的增强 它是
一种过程型语言 JAVA 比它有更多的先进的特性 它允许程序写出比 PL/SQL 更为复
杂的程序 PL/SQL 是基于指定的数据库的增强型 SQL 而 JAVA 则在 CPU 级上工作
的程序 大多数的过程型语言 如 PL/SQL 是针对特定的平台开发的 而 JAVA 则比过
程型语言更高级 它可以在交叉的平台上工作并可以实现标准化
总结
PL/SQL 对标准的 SQL 进行了扩展 PL/SQL 所执行的基本功能与第三代语言相同
它可以使用局部变量来支持动态代码 也就是说块内的数值可以根据用户的输入 指定的
条件 和指针的内容的变化而变化 PL/SQL 使用标准的过程语言来对语句进行控制 IF
THEN 和 LOOP 可以让你按指定的条件搜索 你也可以使用 LOOP 来对指定的指针的内容
进行翻阅
在任何程序中都会有各种错误产生 PL/SQL 通过异常可以让你对产生错误后的行为
进行控制 许多异常是预定义过的 如被零除错误 异常可以在程序运行时根据指定的条
件激活并按程序员所定义的方式进行处理
在今天也介绍一些对 PL/SQL 的实际应用 数据库对象如触发机制 存储过程 包可
以自动完成许多功能 在今天的例子中我们也应用了一些在前一天中所提到的概念
408
…………………………………………………………Page 409……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
问与答
问 在第 18 天中我是否已经学习了我需要对 PL/SQL 所掌握的所有内容
答 当然不是 像今天的介绍只是提及到了一些表层的一些与 SQL 相关的东西 我们
只是提及了一些 SQL 的非常明显的特性使你对 PL/SQL 有一个基本的了解
问 我不用 PL/SQL 行不行
答 当然 你不使用它也是可以的 但是如果你不使用它你会为达到相同的目的而不
得不在第三代编程语言中使用更多的时间和代码 如果你没有使用 ORACLE 那
么请检查你的解释器以找到与 PL/SQL 类似的过程方法
校练场
1 如何在数据库中使用触发机制
2 是否可以将相关的过程存储在一起
3 可以在 PL/SQL 中使用数据操作语言 对不对
4 可以在 PL/SQL 中使用数据定义语言 对不对
5 在 PL/SQL 的语法中是否支持直接的文本输出
6 给出 PL/SQL 语句块的三个主要部分
7 请给出与指针控制相关的命令
练习
1 请定义一个变量 使它可以接受的最大数值为 99。99
2 请定义一个指针 它的内容包括 CUSTOMER_TABLE 表中的所有 CITY 为
INDIANAPOLIS 的客户
3 定义一个名字为 UnknownCode 的异常
4 请写一个语句 使得在 AMOUNT_TABLE 中的AMT 当 CODE 为 A 时其值为 10
当 CODE 为 B 时其值为 20 当 CODE 既不是 A 也不是 B 时激活一个名字叫
Unkn