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

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 



日期类型 



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