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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 可以让你按指定的条件搜索  你也可以使用 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  时激活一个名字叫 



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