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

第77部分

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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






    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; 



 

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

你可能喜欢的