《SQL 21日自学通(V3.0)(PDF格式)》第129章


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 可以让你
小说推荐
返回首页返回目录