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

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

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





个工作没有过程语言           如 PL/SQL 或 SHELL 脚本      的支持是不行的 



    我们可以在一个 SHELL  脚本中使用内嵌的 SQL                  过程语言函数中需要插入适当的语 



法成份     比如逗号  脚本必须足够地聪明以知道哪里是最后一个逗号                            因为在最后一个逗 



号的后边就没有逗号了            脚本也必须知道在哪些地方需要放置括号                     在用数据字典重新生 



                                                                            374 


…………………………………………………………Page 375……………………………………………………………

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



成对象的时候 SEEK 工具是很有用的     不管你是使用 C     Perl shell  scripts COBOL 还是 



PL/SQL 



总结 



   直接地从数据库中生成语句可以避免许多单调乏味的输入 SQL 语句的工作           不管你做 



什么工作   使用 SQL 生成技术都可以在你的某个工作阶段减少你的工作量 



   如果你已经学习了今天的基本内容— — 尽管这些例子是使用 ORACLE 来完成的         你可 



以在其它的关系数据库系统中应用这一概念  请检查你的数据库解释器和数据字典的结构 



以找出它们与本书中例子的不同之外  如果你开明的话  你会发现许多生成 SQL 脚本的方 



法  从简单的语句到高度复杂的系统管理中都有 



问与答 



   问  我如何才能决定是手工写 SQL 还是来生成它 



   答  问你自己下边的问题 



      你解决问题时使用该语句的频繁程度如何 



      在写母语句是否比写子语句耗用更多的时间 



   问  生成 SQL 语句时我有哪些表可供选择 



   答  你可以选择任何一个你可以访问的表        这不管这些表是否为你所有或它是否在数 



据字典中   你可以选择所有在你数据库中的有效对象        比如视图或快捷方式 



   问  我在生成 SQL 语句是是否有限制 



   答  对于大多数的语句你既可以手工写出也可以生成          请检查你的解释器看一下看它 



是否有输出到文件选项以及输出格式是否是你所需要的           切记  在生成输出文件后你应该 



手工修改一下文件的内容 



校练场 



   1  你生成 SQL 的来源有哪两个 



   2  下边的 SQL 语句是否可以工作   它会输出什么 



      SQL》 SET ECHO OFF 



                                                    375 


…………………………………………………………Page 376……………………………………………………………

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



         SQL》 SET FEEDBACK OFF 



         SQL》 SPOOL CNT。SQL 



         SQL》 SELECT 'COUNT(*) FROM  ' || TABLE_NAME || ';' 



         2    FROM  CAT 



         3    / 



    3   下边的 SQL 语句是否可以工作              它会输出什么 



            SQL》 SET ECHO OFF 



            SQL》 SET FEEDBACK OFF 



            SQL》 SPOOL GRANT。SQL 



            SQL》 SELECT 'GRANT CONNECT DBA TO ' || USERNAME || ';' 



            2    FROM  SYS。DBA_USERS 



            3  WHERE USERNAME NOT IN ('SYS';'SYSTEM';'SCOTT') 



            4    / 



    4   下边的 SQL 语句是否可以工作              它会输出什么 



            SQL》 SET ECHO OFF 



            SQL》 SET FEEDBACK OFF 



            SQL》 SELECT 'GRANT CONNECT; DBA TO ' || USERNAME || ';' 



            2    FROM  SYS。DBA_USERS 



            3  WHERE USERNAME NOT IN ('SYS';'SYSTEM';'SCOTT) 



            4    / 



    5   在运行生成的 SQL 时最为将 FEEDBACK 设置为 ON                    对不对 



    6   从 SQL 中生成 SQL 语句时          必须将输入的结果重新定向到一个文件中  对不对 



    7   在生成 SQL  语句用以对表的内容进行删减时                     你必须先确认自己已经对所要删减 



        的表作了很好的备份  对不对 



    8   什么是 ED 命令 



    9   SPOLL OFF 命令是做什么的 



练习 



    1   使用 SYS。DBA_USERS 视图         在 PERSONAL ORACLE 7 中  写一个语句来生成一 



                                                                                  376 


…………………………………………………………Page 377……………………………………………………………

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



       系列 GRANT 语句为下边的五个用户  John              Kevin  Ryan  Ron  和 Chris  授权 使 



       他们可以访问 History_tbl 表      在写语句时对应的用户名用 USERNAME 来代替 



    2   用本章给出的例子作指引  写一些 SQL 来创建一些可以生成你能使用的 SQL 语句 



                                                                           377 


…………………………………………………………Page 378……………………………………………………………

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



第 18 天     PL/SQL 简介 



目标 



   PL/SQL 是一项 ORACLE 的技术  它可以让 SQL 像过程型语言一样工作     到今天的结 



束  你将 



   l  对 PL/SQL 有一个基本的了解 



   l  明白 PL/SQL  的特点以及它与标准的 SQL 的区别 



   l  知道 PL/SQL 编写程序的基本原理 



   l  可以写简单的 PL/SQL 程序 



   l  知道如何处理在 PL/SQL 编程中的错误 



   l  知道如何在真实的世界中使用 PL/SQL 



入门 



   从对标准的 SQL 进行介绍是一种入门 PL/SQL    或 SQL 的方法  SQL 是一种可以让 



关系数据库用户以一种直接的方式来访问数据库的方法  你可以使用 SQL 来对数据库进行 



查询和修改其中的表  在你写 SQL 语句的时候       你可以告诉数据库你要做什么       而不是如 



何去做  优化器会自己决定采用一种最有效的方法来执行你的语句              如果你向数据库中发 



送了一系列标准的 SQL 语句    服务将会按语句的先后次序来执行它们 



   PL/SQL 是 ORACLE 的过程型语言  它由标准的 SQL 语句和一系列可以让你在不同的 



情况下对 SQL  语句的执行进行控制的命令组成  PL/SQL     也可以在运行时捕获错误  储如 



LOOP 和 IF  THEN  ELSE  语句让 PL/SQL 具有了第三代编程语言的能力  PL/SQL 



也可以以交互方式写出      用户友好型界面会把数值赋给它的变量         你可以使用许多种预定 



义的包  它们可以将信息显示给用户 



   今天的内容主要包括 PL/SQL  的以下特性 



   l  程序员可以定义在语句中使用的变量 



   l  程序员可以使用错误控制例程来访止程序的意外中断和退出 



   l  程序员可以写交互式程序来接受来自用户的输入 



                                                      378 


…………………………………………………………Page 379……………………………………………………………

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



   l  程序员可以将功能划分为不同的逻辑代码块            编程的模块化为应用程序开发环境 



      提供了更大的灵活性 



   l  SQL 语句可以并行执行以获得最优的性能 



在 PL/SQL  中的数据类型 



   大多数数据的类型是相似的  但是每一种解释器都有自己独特的存储方式和内部过程 



需要  在写 PL/SQL 的语句块时  你将会定义变量  它们必须是真实的数据类型             下边的 



小标题对 PL/SQL  中可用的变量进行了详细的介绍 



   在 PL/SQL 中也提供了数据类型的子类型  例如         数据类型 NUMBER   的子类型叫 



INTEGER 你可以在 PL/SQL  程序中使用子类型来保证它与其它程序如 COBOL  中数据类 



型的一致  尤其是在其它的程序中内嵌的 PL/SQL  代码时更要如此           子类型只是 ORACLE 



中数据类型的别名  所以它必须遵循与之相关联的数据类型的规则 



注  在大多数的 SQL  解释器中语法的大小写是不敏感的  PL/SQL        同样允许在它的语句中 



使用大小写  它也是大小写不敏感的 



字符串类型 



   在 PL/SQL 中的字符串类型所你所想的一样  是一种常见的数据类型定义  它允许在 



其中有字母和数字  像名字  代码       描述  序列号等都可以包括在字符串中 



   CHAR  中存储着固定长度的字符串  CHAR  在最大长度为 32767  个字节      尽管很难想 



象在哪一个表中的字符串会有这么长 



   语法 



   CHAR ( max_length ) 



   子类型  CHARACTER 



   VARCHAR2  则存储着长度可变的字符串  你会经常用 VARCHAR2  来存储长度可变的 



字符串   比如某人的名字  VARCHAR2 所允许的最大长度为 32767 个字节 



   语法 



   VARCHAR2 ( max_length ) 



   子类型    VARCHAR;  STRING 



                                                         379 


…………………………………………………………Page 380……………………………………………………………

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



   LONG  也可以存储变长的字符串  它的最大长度为 32760  个字节  LONG  是典型的用 



以存储长文本如备注  尽管 VARCHAR2 也能做同样的工作 



数值数据类型 



   NUMBER 用以存储在 ORACLE 数据库中的任何类型的数值 



   语法 



   NUMBER ( max_length ) 



   你也可以使用下边的语法来指定数据类型的精度 



   NUMBER (precision; scale) 



   子类型  DEC  DECIMAL DOUBLE PRECISION INTEGER INT NUMERIC REAL; 



SMALLINT FLOAT 



   PLS_INTEGER 定义的整数是可以带有符号的  例如        负数 



二进制数据类型 



   二进制数据类型可以以二进制形式来存储数据 如图形或图像 这种数据类型包括 RAW 



和 LONGRAW 



日期数据类型 



   DATE 是在 ORACLE 中可以有效存储的数据类型 如果你将某一列定义为 DATE 类型 



你就不能指定它的长度        DATE  数据类型的长度是默认的      ORACLE 数据类型是像 01



OCT…97 这样的 



逻辑数据类型 



   逻辑数据类型可以存储下列数值 TRUE  FALSE 和 NULL      与 DATE 相类似 BOOLEAN 



在作为列或变量的类型在定义时也不需要参数 



                                                          380 


…………………………………………………………Page 381……………………………………………………………

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



ROWID 



    ROWID  是存在于 ORACLE  数据库的每一个表中的预定义列  ROWID                    以二进制格式 



存储和确定表中的每一列            索引就是使用 ROWID 指向数据的 



PL/SQL 块的结构 



    PL/SQL 是一种块结构语言         也就是说 PL/SQL  的程序可以分成逻辑块来写  在一个块 



的内部可以有像数据操作或查询之类的过程  下边将会对 PL/SQL  的块进行详细的讨论 



    l   在 DECLARE   部分包括了定义的变量和其它的对象                 如常量和指针  这一部分在 



        PL/SQL 块中是可以选择的 



    l   PROCDURE 部分包括条件语句和 SQL 语句             块可以对它进行控制          它是 PL/SQL 



        的必须部分 



    l   EXCEPTION  告诉了 PL/SQL    如何处理指定的错误并按用户的定义进行处理                     它 



        也是 PL/SQL  的可选择部分 



    注   块是 PL/SQL   代码的逻辑单元         包括至少一个 PROCDURE         部分和可以选择的 



        DECLARE 以及EXCEPTION 部分 



    这里是 PL/SQL 块的基本结构 



    SYNTAX: 



    BEGIN                  … optional;  denotes  beginning  of  block 



        DECLARE          … optional;  variable  definitions 



        BEGIN              … mandatory;  denotes  beginning  of  procedure  section 



        EXCEPTION      … optional;  denotes  beginning  of  exception  section 



        END                  … mandatory;  denotes  ending  of  procedure  section 



    END                      … optional;  denotes  ending  of  block 



    请注意必要部分在第二个 BEGIN — — END           对中的     它构成了一个过程部分            当然 



在它们中间是有语句的 如果你使用了第一个 BEGIN                   那么你必须同时使用第二个 BEGIN 



反之亦然 



                                                                         381 


…………………………………………………………Page 382……………………………………………………………

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



注释 



    如果一个程序没有注释会怎样              编程语言提供了命令使你可以在你的代码中放放注 



释  PL/SQL 当然不例外  你可以在需要注释的行前加一短线                   公认的 PL/SQL 注释形式如 



下   多行注释则与 C 语言的注释方法相同 



    语法 



    …This is a one…line ment。 



    /* This is a 



    multiple…line ment。*/ 



注  PL/SQL  可以直接支持数据操作言语            DML   命令和数据查询        然而   它不支持数据 



   字典语言     DDL   命令    你通常会使用 PL/SQL      维护在数据库结构中的数据  但是并 



   不能维护这些结构 



DECLARE 部分 



    在 PL/SQL 的 DECLARE  部分包括了变量         常量  指针和特殊数据类型的定义  作为 



一个 PL/SQL   程序员    你可以在你的代码块中定义所有类型的变量                  但是你必须要指定数 



据类型     而且每一个变量都必须与 ORACLE            中所定义的数据类型一致  变量也要符合 



ORACLE 的对象命名标准 



变量声明 



    在 PL/SQL 语句块中变量的数据是可变以             在变量声明时必须对它加以定义              如有必 



须  还要进行初始化工作          下例中定义了一组在 PL/SQL  的 DECLARE 部分的变量 



    DECLARE 



        owner  char(10); 



        tablename  char(30); 



        bytes  number(10); 



        today  date 



分析 



    DECLARE  部分不能自动运行  DECLARE  部分以 DECLARE           语句开头      每一个变量 



                                                                      382 


…………………………………………………………Page 383……………………………………………………………

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



占一行  注意在每一个定义的变量后边都有一个分号 



    在 DECLARE 部分也可以对变量进行初始化工作  例如 



    DECLARE 



        customer  char(30); 



      fiscal_year number(2) := '97'; 



    你可以使用  =符号来进行初始化工作  或者说是赋给它一个初值  对于被定义为 NOT 



NULL  的变量你必须要赋初值 



    DECLARE 



        customer  char(30); 



      fiscal_year number(2) NOT NULL := '97'; 



分析 



    NOT NULL 子句在这里的作用与它在 CREATE TABLE 中所起的作用类似 



常量定义 



    定义常量的方法与定义变量相同              但是常量的数值是静态的           他们不能改变  在上个 



例子中    fiscal_year 可能是常量 



注  在每一个变量的定义都必须以分号结束 



指针定义 



    指针是 PL/SQL   中的另一种类型的变量  在你通常所认为的变量中保存的是数值                         而 



指针型变量则指向了查询结果中的某一行数据  在查询的结果有多个时                            为了分析数据你 



需要在每个记录之间进行翻阅  在查看 PL/SQL               块中的查询结果时        它使用指针来指向返 



回的每一行  下边是一个在 PL/SQL 语句块中定义指针的例子 



INPUT 



    DECLARE 



     cursor employee_cursor is 



            select  *  from  employees; 



    指针与视图类似  通过在 PROCDURE  部分使用 LOOP              循环    你可以翻阅指针        这 



                                                                      383 


…………………………………………………………Page 384……………………………………………………………

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



项技术曾简要地提到过 



%TYPE 属性 



    %TYPE 可以返回表中给定列的变量属性 除了查看在 PL/SQL  中的数据类型定义代码 



你可以使用%TYPE 来保持在你的块中的代码的一致性 



INPUT 



    DECLARE 



        cursor  employee_cursor  is 



            select  emp_id;  emp_name  from  employees; 



        id_num  employees。emp_id%TYPE; 



        name  employees。emp_name%TYPE; 



分析 



    在这个例子中表中 ID_NUM  变量与 EMP_ID 变量具有相同的数据类型  %TYPE 所定 



义的变量 NAME 具有与 EMPLOYEES  中的 emp_name 具有相同的数据类型 



%ROWTYPE 属性 



    变量不仅限于单一的数值            如果你所定义的变量与一个指针相关联的话                   你可以使用 



%ROWTYPE  属性来声明变量与保证它与游标所在行的类型相同                        在 ORACLE   的词典中 



%ROWTYPE 



INPUT 



    DECLARE 



        cursor  employee_cursor  is 



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