按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
2 当插入 更新 删除操作发生时
3 触发机制被调用 其中的语句被自动执行
4 由触发机制自动的完成事务处理的取消或确认操作
例 13。9
本例解决了早些时候更新 RECORDINGS 表时所带来的问题
INPUT
1》 create trigger check_artists
2》 on RECORDINGS
3》 for insert; update as
4》 if not exists (select * from ARTISTS; RECORDINGS
5》 where ARTISTS。artist_id = RECORDINGS。artist_id)
6》 begin
7》 print 〃Illegal Artist_ID!〃
8》 rollback transaction
9》 end
275
…………………………………………………………Page 276……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
10》 go
分析
类似的问题也可能在删除 RECORDINGS 表中的记录时出现 如果你只是将
RECORDINGS 表中将某个艺术家删除了 你可能也想同时删除 ARTIST 表中的艺术家记
录 如果在触发机制激活之前记录已经被删除了 那么你如何才能知道哪一个 ARTIST_ID
记录才是需要删除的记录呢 对于这个问题有两种解决的办法
l 将 ARTIST 表中的所有不在 RECORDINGS 表中存在记录的艺术家删除 见例
13。10a
l 检查被删除过的逻辑表 Transcat…SQL 可以维护两个表 DELETED 和
INSERTED 这两个表中保存着对真实表的最近所做的改动 它与触发机制所创
建的表有着相同的结构 因此 你可以从 DELETE 表中获得 ARTIST_ID 的内容
并将它从 ARTIST 中删除 见例 13。10b
例 13。10a
INPUT
1》 create trigger delete_artists
2》 on RECORDINGS
3》 for delete as
4》 begin
5》 delete from ARTISTS where artist_id not in
6》 (select artist_id from RECORDINGS)
7》 end
8》 go
例 13。10b
1》 create trigger delete_artists
2》 on RECORDINGS
3》 for delete as
4》 begin
5》 delete ARTISTS from ARTISTS; deleted
6》 where ARTIST。artist_id = deleted。artist_id
7》 end
276
…………………………………………………………Page 277……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
8》 go
使用触发机制时的限制
l 当你在使用触发机制时你必须要知道它有如下的使用限制
l 不能在临时表中创建触发机制
l 触发机制必须在当前的表所在的数据库中创建
l 不能在视图中创建触发机制
l 当表被删除以后 所有与之相关的触发机制会被自动地删除
触发机制的嵌套
触发机制也可以被嵌套 比如说你可以创建一个触发机制来执行删除动作 例如 如
果触发机制自己删除了一个记录 数据库服务器可以据此激活另一个触发机制 结果将会
不停地循环 直到表中的所有记录都被删除掉 或一些其他的触发条件被激活 嵌套机制
不是默认的 可是 环境中必须提供这个功能 对于这个主题你可以参考你的数据库文档
来得到更多的内容
在选择语句中使用更新和删除
这是复合使用更新和删除语句的命令
INPUT
SQL》 UPPDATE EMPLOYEE_TBL
SET LAST_NAME = 'SMITH'
WHERE EXISTS (SELECT EMPLOYEE_ID
FROM PAYROLL_TBL
WHERE EMPLOYEE_ID = 2);
OUTPUT
1 row updated。
分析
EMPLOYEE 表中有一个雇员的名字是不正确的 我们只有当薪水表中出现的错误的 ID
277
…………………………………………………………Page 278……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
时才会更新雇员表
INPUT/OUTPUT
SQL》 UPDATE EMPLOYEE_TABLE
SET HOURLY_PAY = 'HOURLY_PAY * 1。1
WHERE EMPLOYEE_ID = (SELECT EMPLOYEE_ID
FROM PAYROLL_TBL
WHERE EMPLOYEE_ID = '222222222');
1 row updated。
分析
我们将该雇员的小时报酬增加了 10%
INPUT/OUTPUT
SQL》 DELETE FROM EMPLOYEE_TBL
WHERE EMPLOYEE_ID = (SELECT EMPLOYEE_ID
FROM PAYROLL_TBL
WHERE EMPLOYEE_ID = '222222222';
1 row deleted。
分析
我们将雇员 ID 号为 222222222 的雇员删除了
在执行前测试选择语句
如果你正在创建报表 比如你使用的是 SQL*PLUS 而且报表是比较大的 你也许会
想在运行之前先检查一个空格 列 标题 这会浪费你许多的时间 一个比较好的检查方
法是在你的 SQL 语句中使用 add where rownum 《 3
SYNTAX
SQL》 select *
from employee_tbl
where rownum 《 5
分析
这时你可以得到表中的前四行 用它你可以检查是否拼写 空格和看起是否合适 否
278
…………………………………………………………Page 279……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
则 在你发现报表中的拼写错误或不正确的空格时你的报表已经返回了成百上千行
技巧 实现你的顾客的真正的需要是你的一项重要的工作 它大概会占你所有工作中的一
半 在特定的工作中拥有好的沟通手段和知识将会是你编程技能的有益补充 例如
如果你为一个小汽车代理商工作 它的经理想要知道在未来一段时间内他将会有多
少小汽车进帐 你认为 只是你自己 对此进行计数将会很好 他问的是他有多
少小汽车 但是 其实经理人真正想知道的是他有多少种类型的汽车 小汽车 卡
车 汽车的型号 生产的时间等等 是不是他的要求会浪费你许多的时间 或者说
你给他的是不是他所需要的
嵌入型 SQL
本书中的嵌入型 SQL 这一术语在用 SQL 来编写大型程序时经常用到 它的意思就是
可以将存贮过程嵌入到数据库之中并且它可以被应用程序来调用以处理一些任务 一些数
据库系统提供了一整套的工具可以让你将 SQL 与程序设计语言结合在一起用以创建简单的
屏幕和菜单对象 SQL 代码被嵌入到这些代码之中
静态 SQL 与动态 SQL
静态 SQL 的意思就是指在程序中直接写入 SQL 代码 这些代码在运行的时候不能被
更新 事实上 大多数静态 SQL 解释器需要将你的 SQL 语句在运行之前进行预编译处理
ORACLE 7 与 INFORMIX 都为他们的数据库系统开发了静态 SQL 包 这些经过预编译的
产品可以在几种语言环境中使用 主要有以下几种语言
l C
l PASCAL
l ADA
l COBLE
l FORTRAN
静态 SQL 的好处在于
l 提高运行时的速度
l 经过了编译错误检查
279
…………………………………………………………Page 280……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
它的缺点是
l 灵活性差
l 需要更多的代码 因为查询不能在运行时进行变更
l 它对于其它的数据库系统来说使用起来不方便 这一因素你必须要考虑到
如果你将这些代码打印出来的话 SQL 的语言将会出现在 C 语言的代码 或者是你所
使用的那种语言 在进行预编译处理时字段要受到程序变量的限制 例 13。11 是一个简单
的静态 SQL 的使用实例
动态 SQL 是另外一种方法 它可以让程序员在运行时构建 SQL 语句并把这些语句提