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

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!




        GGG                   PaidinFull 



        HHH                   PaidinFull 



       ABC                    StillOwes      60。49 



        DDD                   StillOwes      150。95 



        BBB                   StillOwes      50。00 



分析 



    从 PAYMENT_TABLE  获得的数据中有一行被插入到了 PAY_STATUS_TABLE  表中 



如果用户的付款金额比应付金额更多                 那么差额将会被输入到 AMT_CREDIT            列中  如果 



用户的支付金额少于应付金额  那么将会在 AMT_OWED                    中输入一个信息  如果客户已经 



全部支付完毕       那么这两列中就不会有任何数据 



又一个程序 



    在这个例子中使用的表叫 PAY_TABLE 



输入 



    SQL》 desc pay_table 



输出 



    Name            Null?          Type 



    NAME            NOT NULL       VARCHAR2(20) 



    PAY_TYPE        NOT NULL       VARCHAR2(8) 



    PAY_RATE        NOT NULL       NUMBER(8;2) 



    EFF_DATE        NOT NULL       DATE 



    PREV_PAY                       NUMBER(8;2) 



    先来看一下数据 



                                                                         400 


…………………………………………………………Page 401……………………………………………………………

SQL 21  日自学通(V1。0)                                                             翻译人     笨猪 



输入 



     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。50  15…MAY…96 



KEITH JONES                HOURLY                    10。00  31…OCT…96 



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                 35000。00  15…JUN…96 



KEVIN TROLLBERG            SALARY                 27500。00  15…JUN…96 



     现实情况        由于销售情况很好  你需要给为你工作的时间超过了六个月的个人增加薪 



金    符合条件的钟点工的薪金增加 4%                    而符全条件的雇员的薪金需要增加 5% 



     今天的日期是 



     输入/输出 



     SQL》 select sysdate from dual 



     SYSDATE 



     20…MAY…97 



     在对下边的 PL/SQL         语句块进行检查之前              我们要对 PAY_TABLE  表进行手工的选择 



以找出都有哪些人需要增加薪金 



输入 



     SQL》 select name; pay_type; pay_rate; eff_date; 



         2                  'YES'  due 



         3    from  pay_table 



         4    where  eff_date  《  sysdate   180 



         5    UNION  ALL 



         6    select  name;  pay_type;  pay_rate;  eff_date; 



         7                  'No'  due 



         8    from  pay_table 



         9    where  eff_date  》=  sysdate   180 



                                                                                        401 


…………………………………………………………Page 402……………………………………………………………

SQL 21  日自学通(V1。0)                                                                        翻译人      笨猪 



       10    order  by  2;  3  desc; 



输出 



   NAME                         PAY_TYPE          PAY_RATE          EFF_DATE          DUE 



    SANDRA SAMUELS              HOURLY                      12。50   01…JAN…97         No 



    ROBERT BOBAY                HOURLY                      11。50   15…MAY…96         YES 



    KEITH JONES                 HOURLY                      10。00   31…OCT…96         YES 



    SUSAN WILLIAMS              HOURLY                       9。75   01…MAY…97           No 



    CHRISSY ZOES                SALARY                   50000。00   01…JAN…97         No 



    CLODE EVANS                 SALARY                   42150。00   01…MAR…97         No 



    JOHN SMITH                  SALARY                   35000。00   15…JUN…96         YES 



    KEVIN TROLLBERG             SALARY                   27500。00   15…JUN…96         YES 



     DUE 列的内容是确定每一个人是否有增加工资的资格                                       下边是 PL/SQL  的脚本 



输入 



     set serveroutput on 



     BEGIN 



         DECLARE 



             UnknownPayType  exception; 



             cursor  pay_cursor  is 



                 select  name;  pay_type;  pay_rate;  eff_date; 



                               sysdate;  rowid 



                 from  pay_table; 



             IndRec  pay_cursor%ROWTYPE; 



             cOldDate  date; 



             fNewPay  number(8;2); 



         BEGIN 



             open  pay_cursor; 



             loop 



             fetch  pay_cursor  into  IndRec; 



             exit  when  pay_cursor%NOTFOUND; 



             cOldDate  :=  sysdate   180; 



         if (IndRec。pay_type = 'SALARY') then 



                                                                                                     402 


…………………………………………………………Page 403……………………………………………………………

SQL 21  日自学通(V1。0)                                                                                        翻译人        笨猪 



                  fNewPay  :=  IndRec。pay_rate  *  1。05; 



              elsif  (IndRec。pay_type  =  'HOURLY')  then 



                  fNewPay  :=  IndRec。pay_rate  *  1。04; 



              else 



                  raise  UnknownPayType; 



              end  if; 



              if  (IndRec。eff_date  《  cOldDate)  then 



                  update  pay_table 



                  set  pay_rate  =  fNewPay; 



                          prev_pay  =  IndRec。pay_rate; 



                          eff_date  =  IndRec。sysdate 



                  where  rowid  =  IndRec。rowid; 



                  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; 



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