友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第52部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
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 语句并把这些语句提
交给数据库引擎 引擎再将数据返回给程序变量 这也是在运行时实现的 这一主题已经
在第 12 天进行过非常彻底的讨论了
例 13。11
本例给出了静态 SQL 的 C 语言中的使用方法 注意到这里的语法并不是完全依照 ANSI
标准来实施的 静态 SQL 不同于任何商业化的产品 尽管它的语法与商业化的产品类似
INPUT:
BOOL Print_Employee_Info (void)
{
int Age = 0;
char Name'41' = 〃0〃;
char Address'81' = 〃0〃;
/* Now Bind Each Field We Will Select To a Program Variable */
#SQL BIND(AGE; Age)
#SQL BIND(NAME; Name);
#SQL BIND(ADDRESS; Address);
/* The above statements 〃bind〃 fields from the database to variables from the program。
After we query the database; we will scroll the records returned
and then print them to the screen */
#SQL SELECT AGE; NAME; ADDRESS FROM EMPLOYEES;
#SQL FIRST_RECORD
280
…………………………………………………………Page 281……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
if (Age == NULL)
{
return FALSE;
}
while (Age != NULL)
{
printf(〃AGE = %dn; Age);
printf(〃NAME = %sn; Name);
printf(〃ADDRESS = %sn〃; Address);
#SQL NEXT_RECORD
}
return TRUE;
}
分析
当你输入你的代码并把它们保存到文件之中以后 这些代码通常要经过某种类型的预
编译处理方可运行 预编译会将带有#SQL 的指令转换为真正在 C 代码指令 然后将它与
你其它的 C 语言代码一同编译
如果你从来没有看过或写过 C 语言的程序 那么不要对例 13。11 中的语法过份留心 在
早些时候 静态的 SQL 只是一些伪指令 请参阅在你的产品中的关于静态 SQL 的真正语
法
使用 SQL 来编程
到目前为止 我们已经讨论了两种在编程中使用的 SQL 第一种方法来写查询和更新
数据已经在本书的第 12 天中进行了详细的讨论 第二种特点可以在第 3 代或第 4 代编程语
言中使用 显然 如果你想知道该语言和一般的数据库编程知识那么你可以使用第一种语
言 我们已经讨论过了静态 SQL 与动态 SQL 相比的优点和缺点 在第 18 天 PL/SQL 简
介 和第 19 天的 Transcat…SQL 简介 将会包括两种扩充的 SQL 来取代嵌入型 SQL 来完
成在这一部分讨论的相同类型的工作
281
…………………………………………………………Page 282……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
总结
在通用的编程环境如 VISUAL BASIC DELPHI 和 POWERBUILDER 中为数据库编
程人员提供了许多的工具来对数据库进行查询和更新数据库的工作 但是 随着你对数据
库的日益深入 你将会发现在今天讨论的主题中和使用这些工具的优点 不幸的是 有关
于游标 触发机制和存贮过程等概念是在最近的数据库系统中提出的 它们的标准化程序
还不高 但是 基本的使用的理论在几乎所有的数据库系统中都提供了
临时表是一种存在于用户会话过程中的表 这种表是存在于一个特殊的数据库之中 在
SQL SERVER 中称之为 TEMPDB FETCH 语句用以从游标中获得指定的记录或使游标移
向下一个记录 它经常将日期和时间作为其名称的唯一标识 临时表可以存贮查询的结果
以供以后的查询使用 如果多用户在同时在同时创建和使用了临时表 由于在 TEMPDB
中有大量的活动从而会导致系统性能的下降
存贮过程是一种可以将多个 SQL 语句结合在一起作为一个函数的数据库对象 存贮过
程可以接受和返回参数值并且可以被其它的存贮过程调用 该过程是运行于数据库服务器
中并且是经过编译的 使用存贮过程与直接使用 SQL 语句相比可以提高系统的性能
内嵌型SQL 可以将 SQL 代码用于实际编程中 内嵌型SQL 可分为静态 SQL 与动态SQL
两类 静态 SQL 不能是运行时进行修改 而动态 S
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!