友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!