按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 可以让你