友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

SQL 21日自学通(V3.0)(PDF格式)-第129章

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




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 可以让你
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!