友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第52部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
mit;
end if;
end loop;
close pay_cursor;
EXCEPTION
when UnknownPayType then
dbms_output。put_line('=======================');
dbms_output。put_line('ERROR: Aborting program。');
dbms_output。put_line('Unknown Pay Type for Name');
when others then
dbms_output。put_line('ERROR During Processing。 See the DBA。');
END;
END;
/
你是否已经决定了要给这四个雇员增加工资 在上边的 SELECT 语句中有四个人有
YES 标记 为什么不呢 让我们给所有的这四个人加薪吧 你可以通过运行名字叫
block2。sql 的脚本来自动为这四个人进行合理的加薪
输入/输出
403
…………………………………………………………Page 404……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 @block2
Input truncated to 1 characters
PL/SQL procedure successfully pleted。
你可以作一个快速的检查也确定对于每个人的薪金的增加比率是多少
输入
SQL》 select * from pay_table order by pay_type; pay_rate desc
输出
NAME PAY_TYPE PAY_RATE EFF_DATE PREV_PAY
SANDRA SAMUELS HOURLY 12。50 01…JAN…97
ROBERT BOBAY HOURLY 11。96 20…MAY…97 11。5
KEITH JONES HOURLY 10。40 20…MAY…97 10
SUSAN WILLIAMS HOURLY 9。75 01…MAY…97
CHRISSY ZOES SALARY 50000。00 01…JAN…97
CLODE EVANS SALARY 42150。00 01…MAR…97
JOHN SMITH SALARY 36750。00 20…MAY…97 35000
KEVIN TROLLBERG SALARY 28875。00 20…MAY…97 27500
分析
四个雇员的薪金已经增加了 如果将现在的输出和原来的 SELECT 的输出做比较的话
你会发现相应的改变 当前的薪金率的变化反映和薪金的增加 原有的薪金率被插入到了
PREV_PAY 列中 而有效日期则被更新为当前的日期 没有符合资格的人的情况则没有任
何变化
请等一下 我们没有看到定义的异常工作的机会 你可以向 PAY_TABLE 表中插入一
个不合法的记录来对异常部分进行检测
输入
SQL》 insert into pay_table values
2 ('JEFF JENNINGS';'WEEKLY';71。50;'01…JAN…97';NULL);
输出
1 row created。
输入/输出
SQL》 @block2
404
…………………………………………………………Page 405……………………………………………………………
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 时激活一个名字叫
UnknownCode 的异常 表中的内容只有一行
409
…………………………………………………………Page 410……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第 19 天 TRANSACT…SQL 简介
目标
与 TRANSACT…SQL 是对标准 SQL 的补充一样 今天的内容是对前几天内容的补充
今天的目标是
l 知道一种对 SQL 的流行的扩展
l 知道 TRANSACT…SQL 的主要特性
l 给出一些特殊的例子让你知道如何去使用 TRANSACT…SQL
TRANSACT…SQL 概貌
在第 13 天的 高级 SQL 中我们简要地提到过静态 SQL 在第 13 天的例子中我们也
描述了如何在第三代编程语言如 C 中写内嵌的 SQL 语句的方法 由于采用这种方法时嵌
入的 SQL 语句是无法改变的所以它的灵活性就受到了限制 而如果我们采用动态的 SQL
语言编程来完成相同的工作时 就允许 SQL 代码的条件在运行时改变
在本书中我们其实已经讨论过了相关的每一个主题 几乎每一个数据库供应商都在它
的语言进行了相应的扩展 TRANSACT…SQL 是 SYBASE 和 MICROSOFT SQL SERVER 的
产品 而 ORACLE 的产品是 PL/SQL 这里的每一种语言可以完成全部的到目前为止我们
所讨论的每一件事 此外 每一种产品都对标准的 SQL 进行了相应的扩展
对 ANSI SQL 的扩展
为了演示使用这些扩展来创建实际的程序 我们使用了 SYBASE 和 MICROSOFT SQL
SERVER 的 TRANSACT…SQL 它具有大多数的在第三代编程语言中具有的结构 对于针
对 SQL…SERVER 的特性它也提供了许多便利的工具用以进行数据库编程 在其它的数据库
供应商中也提供了与之类似和更多的特性
410
…………………………………………………………Page 411……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
谁需要使用 TRANSACT…SQL
任何一个读过本书的人都会使用 TRANSACT…SQL 如果是一个程序员它偶尔会用它
来写一个查询 如果是开发员则可以用它写应用程序以创建对象如触发机制和存贮过程等
注 SYBASE 和 MICROSOFT SQL SERVER 的用户如果想开发实际上的关系数据库应用程
序就必须使用 TRANSACZT…SQL 的特性
TRANSACT…SQL 的基本组件
对 SQL 的扩展已经超过了 SQL 作为一种过程型语言的限制 例如 TRANSACT…SQL
可以让你对数据库的事务进行紧密的控制并且可以写出数据库过程程序以把编程人员从冗
重的代码中解放出来
l 在第 19 天我们主要会提到 TRANSACT…SQL 的以下主要特性
l 提供了更大范围的数据类型以优化数据的存贮
l 程序流控制命令如 IF…THEN 和 LOOP 语句
l 在 SQL 语句中使用变量
l 使用 PUTATION 生成摘要报告
l 对 SQL 语句的诊断和分析特性
l 对标准的 SQL 语句提供了许多其它的选项
数据类型
在第 9 天的 创建和操作表 中我们讨论过数据类型 当使用 SQL 创建表时 我们必
须为每一列指定数据类型
注 在不同的 SQL 解释器中数据的类型是不同的 因为每一种数据库服务存储数据的方法
都是各不相同的 举例来说 ORACLE 有它自己选定的数据类型 而 SYBASE 和
MICROSOFT SQL SERVER 则有他们自己的数据类型
SYBASE 和 MICROSOFT SQL SERVER 支持下列数据类型
411
…………………………………………………………Page 412……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
字符串
char 用以存储长度固定的字符串 例如 STATE 的缩写— — 你知道这一列只有两个字符
Varchar 用以存储长度可变的字符串 如人名 它是无法对其长度进行预先指定的 例
如 AL RAY 与 WILLIAM STEPHENSON
Text 存贮的字符长度几乎是不受限制的例如一种服务的备注和描述字段
数字类型
int 存储的整型数值范围为…2;147;483;647 到+2;147;483;647
Smallint 存储的整型数值的范围为…32;768 到 32;767
Tinyint 存储的整型数值的范围为 0 到 255
Float 可以存储有精度要求的浮点数 数值范围为+2。23E…308 和+1。79E308
Real 可以存储的数据的精度为 1。18E…38 to +3。40E38
日期类型
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!