八宝书库 > 文学其他电子书 > SQL 21日自学通(V3.0)(PDF格式) >

第57部分

SQL 21日自学通(V3.0)(PDF格式)-第57部分

小说: SQL 21日自学通(V3.0)(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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  语句并把这些语句提 



交给数据库引擎          引擎再将数据返回给程序变量  这也是在运行时实现的                          这一主题已经 



在第 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                        的真正语 

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的