o数据库技术第07章与基础_第1页
o数据库技术第07章与基础_第2页
o数据库技术第07章与基础_第3页
o数据库技术第07章与基础_第4页
o数据库技术第07章与基础_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 SQL 与 PL/SQL 基础7.1 SQL 命令概述SQL(Structured Query Language)是结构化语言的缩写,它是目前使用最广泛的数据库语言,SQL 是由 IBM 发展起来的,后来被许多数据库软件公司接受的一个标准。SQL 是一种灵活、有效的语言,它的一些功能特性专门用来处理和检验关系型数据。SQL 是一种第四代语言,这就意味着该语言会描述应该做些什么,但是描述如何去做。PL/SQL 是 ANSI 标准 SQL 的 Oracle 版本的过程化语言的扩展。PL/SQL 像第三代(3GL)过程化语言一样,要求一步步指导来确定下一步做什么。类似其他的工业标准语言,PL

2、/SQL提供变量、赋值、条件测试与分支以及迭代的语言元素。但真正实现对数据库的操作还是通过 SQL 命令来实现的。所以在介绍 PL/SQL 之前,我们必须要知道基本的 SQL 命令。Oracle 中 SQL 语言命令共分为六个类别,如下表所示:表 7-1 SQL 基本命令分类这些命令语句的主要含义如下:Ø 数据定义语言(Data definition language,简称 DDL)语句用来创建、删除或者更改一个数据模式对象的结构。更改数据模式对象的令也是 DDL。Ø 数据语言(Data manipulation language,简称 DML)语句用来改变表中的数据或者数

3、据库表中的数据,但是改变表或其他对象的结构。Ø 事务(Transaction control)语句通过将 SQL 语句组织成逻辑的事务(可以称为一个单元,也可以不成为一个单元)数据的一致性。Ø 会话设置。Ø 系统理 rachiving)。(Session control 语句会更改单个数据库连接的设置,例如,启动 SQL 跟踪(system control)语句会改变整个数据库的设置,例如,启动或者文档管类别SQL 语句数据定义语言(DDL)DROP、CREATE、ALTER、GRANT、REVOKE数据语言(DML)SELECT、INSERT、UPDATE、DE

4、LETE、SET TRANSACTION、EXPLAIN PLAN事务COMMIT、ROLLBACK、SAVEPOINT会话ALTER SESSION、SET ROLE系统ALTER SYSTEMSQLCONNECT、DECLARE CURSOR、ALLOCATE134SQL(Embedded SQL)命令用在 Oracle 预编译程序中。¾7.2数据定义语言(DDL)DDL 语言命令用于执行下列任务:Ø 建立、更改或删除表、视图、索引等模式对象。Ø 对和的或回收。Ø 建立审计选择。Ø 在数据字典中增加注释。当用户执行DDL语句时,在每一条DD

5、L语句执行前后,Oracle都将隐式提交当前的事务,理解这一点很重要。因此,如果用户使用insert命令到数据库中后,执行了一条DDL语句,如create table,此时来自insert命令的数据将被提交到数据库而不需要在使用COMMIT来显式提交。数据定义语言在第九有详细介绍。下表中列出了一部分的DDL语句。表 7-2 部分 DDL 语句列表例一,我们创建一个如图 3-2 所示的雇员表,并给表指定一个名字为 employee:CREATE TABLE employee (EMP_ID INTEGER,NAME VARCHAR2(8), ADDRESS VARCHAR2(100);SQL命令

6、功能Alter procedure重编译过程Alter table增加表列、重定义表列、更改分配analyze收集数据库对象的性能统计值并送入基于代价的优化器Alter table add constraint在已有的表上增加约束Create procedure创建过程Create table创建表Create index创建索引Drop index删除索引Drop table删除表grant将或授予用户或其他truncate删除表中所有行revoke从用户或数据库回收135例二,为该表创建唯一索引,索引字段为EMP_ID:CREATE UNIQUE INDEX ibx_empON emplo

7、yee (EMP_ID);例三,在数据库中创建一个用户,使该用户具有基本的RESOURCE和CONNECT系统特权(有关系统的概念可以参考相关的系统管理资料)。CREATE USER user1 IDENTIFIED BY user1;GRANT RESOURCE, CONNECT TO user1;具有 RESOURCE 和 CONNECT 这些注意:一般开发就够了。例四,操作一般,对于一个对象而言,可以具有以下对象:ALTER、DELETE、EXECUTE(只对于函数和过程而言)、INSERT、REFERENCES、SELECT和UPDATE。具体到第十章会详细定义。现在将表employe

8、e的除了DELETE的为下面两步:外所有对象授予用户scott,可以分GRANT ALL ON employee TO user1;REVOKE DELETE ON employee FROM user1;例五,清空表employee:TRUNCATE TABLE employee;例六,删除前面创建的索引ibx_emp:DROP INDEX ibx_emp;例七,删除创建的这个表employee:DROP TABLE employee;7.3 数据语言(DML)数据语言用户对数据库中的数据进行insert、update、delete和select等操作。正如名字所示,用户可以通过DML语句来

9、数据库中的数据内容。总之,DML语句是用户用来136处理数据库中的数据的SQL命令。最常用的 DML 语句是 SELECT、INSERT、UPDATE 和 DELETE。当从 SQL *PLUS 中执行 SQL 语句时,结果会反馈到屏幕上。对于 UPDATE、INSERT或 DELETE 语句,SQI*Plus 会返回被处理的行的数量。对于 SELECT 语句,匹配回显到屏幕上。的行会7.3.1 INSERT 语句INSERT 语句用于给已有的表或视图添加。INSERT 语句的基本语法如下:INSERT INTO table_name column_name VALUES (values)|s

10、ubquery;其中:table_name 为要column_name 为要的表名称;数据的字段名称;Values 是要放到字段中的数据。如果 INSERT 语句包含 subquery,则表示从一个子例如,假设在用户 usr1 模式下创建表 employee:来中数据。CREATE TABLE employee (EMP_ID INTEGER, NAME VARCHAR2(8), DEPT_ID INTEGER, SALARY NUMBER(10,2),ADDRESS VARCHAR2(100);ALTER TABLE employeeADD CONSTRAINT pk_emp_ primar

11、y key(EMP_ID);语句:INSERT INTO employee VALUES (1,令狐冲,1,3000,恒山); INSERT INTO employee VALUES (2,岳不群,1,3500,华山);INSERT INTO employee VALUES (3,东方不败,2,4000,黑木崖);COMMIT;还可以通过 PL/SQL 程序中添加,例如:DECLAREv_id INTEGER; v_name VARCHAR2(8); v_dept INTEGER; v_sal NUMBER(10,2);v_addr VARCHAR2(100);137BEGIN-直接使用DML

12、INSERT INTO employee VALUES (4,任我行,2,4500,黑木崖); COMMIT;-使用变量数据v_id:=5;v_name:=v_dept:=3; v_sal:=2000;v_addr:=福州;INSERT INTO employee VALUES(v_id,v_name,v_dept,v_sal,v_addr); COMMIT;END;/7.3.2 SELECT 语句SELECT 语句的作用是从数据库中获取数据。同时和可以将返回的进行排序、分组、进行多表连接甚至将结果交给一个INSERT语句到另外一个表中。SELECT 语句的基本语法为:SELECT*|colu

13、mn, INTO variable|collection FROM table_name,WHERE where_condition GROUP BY group_expr CONNECT BY conn_condition ORDER BY order_expr DESC这里,column,为一列或多列的列名列表。这些列将显示在结果中。INTO variable|collection,该选项一般出现在 PL/SQL 程序块中。表示将结果返回给变量或者集合。Variable 为结果返回给哪个变量,collection 表示结果要返回到的集合。table_name,为从哪个表中,可以从多个表中进

14、行。where_condition 为group_expr 为分组表回单行的总计信息。的条件,的结果为那些满足条件 where_condition 的。,即返回的按 group_expr 的值进行分组,对于每一组将返conn_condition 指定层次结构的双亲行与子行之间的。order_expr 为指定返回行的排序顺序,DESC 表示降序排列。下面介绍 SELECT 语句的几个范例。例一,表 employee 的:column name format a10;138column addr format a30;SELECT emp_id,name,address addr from emp

15、loyee;上述结果如下:EMP_ID NAMEADDR1 令狐冲2 岳不群3 东方不败4 任我行5恒山华山黑木崖黑木崖福州例二,分组各个部门的工资总数和平均数,结果按照 dept_id 降序排列:SELECT dept_id,SUM(salary),AVG(salary) FROM employee GROUP BY dept_idORDER BY dept_id DESC;执行结果如下:DEPT_ID SUM(SALARY) AVG(SALARY)321200085006500200042503250例三,多表连接。还需要创建一个表 department:CREATE TABLE depa

16、rtment (dept_id INTEGER, dept_name VARCHAR2(20); ALTER TABLE departmentADD CONSTRAINT pk_dept PRIMARY KEY (dept_id);然后给表添加:INSERT INTO department VALUES(1,开发部); INSERT INTO department VALUES(2,财务部);INSERT INTO department VALUES(3,测试部);139COMMIT;如果我们想要检索 employee 表的所有的部门名称:column name format a10;SELE

17、CT emp_id,name,dept_name from employee e, department d WHERE e.dept_id=d.dept_id;结果如下:EMP_ID NAMEDEPT_NAME1 令狐冲2 岳不群3 东方不败4 任我行5开发部开发部财务部财务部测试部例四,通过中数据。假设我们创建了另外一个表:CREATE TABLE programmer (emp_id INTEGER, emp_name VARCHAR2(8),Address VARCHAR(100);可以采用如下语句进行操作:INSERT INTO programmerSELECT emp_id,nam

18、e,address from employee e, department d WHERE e.dept_id=d.dept_id and d.dept_name=开发部;SELECT 语句可以使用在 PL/SQL 程序块中,但其目的是将或集合。这时需要在 SELECT 语句中加 INTO 选项。例如:的结果赋值给某个变量DECLAREV_emp_name VARCHAR(8); BEGINSELECT name INTO v_emp_name FROM employeeWHERE emp_id=1;140DBMS_OUTPUT.PUT_LINE(v_emp_name); END;/7.3.3

19、 UPDATE 语句UPDATE 语句使用户可以修改表中已经有的UPDATE table_nameSET (column_name=value) WHERE condition;其中 table_name 为要更改的表名;的值。UPDATE 语句的基本语法如下:column_name 为要更新的字段;value 表示将要更新的字段更改为 value 值;WHERE 子句标识哪些需要更改,condition 表明满足条件 condition 的才会被更改,其它被更改。例如我们修改 department 表,让其部门号为 1 的部门名称更改为软件开发部:UPDATE departmentSET d

20、ept_name=软件开发部 WHERE dept_id=1;COMMIT;也可以通过 PL/SQL 中调用PDATE 语句来完成:BEGINUPDATE departmentSET dept_name=软件开发部 WHERE dept_id=1;COMMIT; END;/7.3.4 DELETE 语句DELETE 语句使用户可以删除表中的DELETE from table_name WHERE condition;其中 table_name 为要删除的表名;。DELETE 语句的基本语法如下:WHERE 子句标识哪些要被删除,condition 表明满足条件 condition 的才会被删除

21、,其它被删除。例如我们删除 employee 表中所有 dept_id=2 的:DELETE from employee141WHERE dept_id=2;COMMIT;与其它的 DML 语句一样,该语句可以在 PL/SQL 块中实现:BEGINDELETE from employee WHERE dept_id=2; COMMIT;END;/7.3.5 LOCK TABLE 命令假如用户甲正在对 A 表进行操作要更新或其中的数据,这时用户乙却要删除 A 表。如果甲的操作还没有完成,乙已经将 A 表删除了。这样的后果将是破坏性的。这时 ORACLE提供了锁定,只有当用户甲完成对 A 表的操作

22、 ORACLE 才会解除锁定让用户乙删除 A 表。ORACLE 提供了多种锁定,其中最常用的锁定为:表锁定和锁定。表锁定是指当一个事务一个表的时候,对这个表实行数据锁定以确保当前的事务可以数据,并防止别的用户或事务同时对该表进行的进行锁定。时造成,用于保护表中的数据。而锁定是对表一些 DML 语句如 INSERT、UPDATE、DELETE 以及带有 UPDATE 的 SELECT 语句会自动对表进行锁定。在不影响完整性的前提下 ORACLE 自动尽量以最低的模式进行锁定。也可以使用 LOCK TABLE 命令显式地进行锁定并覆盖默认的锁定机制。LOCK TABLE命令的语法如下:LOCK T

23、ABLE table_name IN lockmode MODENOWAIT其中:tablename 是你要锁定的特定的表或的视图名称. Lockmode 是你想要设定的锁定模式:1. ROW SHARE这是一种限制性最小的锁定,它在锁定表的同时别的事务并发任何事务对同、修改、删除和锁定(LOCK TABLE)。它不。的对同一个表执行一个表进行的写2. ROW EXCLUSIVE这种锁定发生在当一个表的多条被更新时。它在作用上基本和 ROW SHARE 等价。它也别的事务对同一个表执行、修改、删除和锁定。但它别的事务不能对同一个表进行 SHARE LOCK、EXCLUSIVE 和 ROW SH

24、ARE 锁定。3. SHARE LOCK这种锁定只,执行 SELECT FOR UPDATE 更新或、修改和删除工作。如果两个事务都别的事务加 SHARE LOCK 锁。其防止任何事务对同一个表的加了 SHARE LOCK 锁,则都不可以修改,除非改为 SHARE ROW EXCLUSIVE。1424. SHARE ROW EXCLUSIVE与 SHARE LOCK 类似只别的事务,执行SELECT FOR UPDATE 更新,但不SELECT 语句中。加任何锁。此种锁定一般只用于带 UPDATE 的5. EXCLUSIVE该事务是以独占的方式写一个表。此间只别的用户和该表,而不进行任何的、修

25、改和删除工作。NOWAIT 该项是可选的.如果你指定它,则当我们试图锁定一个表的时候,如果该表已被别的事务锁定则立即把返还给事务;如果我们不用 NOWAIT 选项则会一直在等待,只到该表的锁定被解除,然后再锁定该表,开始执行事务。例如:LOCK TABLE TDZ,TDZJSJLIN EXLCUSIVE MODE NOWAIT;7.4 事务命令事务(Transaction)可以被看作一个工作逻辑单元,由一系列的 SQL 语句组成,这些语句要么全部执行要么全部不执行,如果其中有任一条 SQL 语句执行失败,则全部语句都执行,这样就数据的一致性和完整性。一个简单的例子:如果我们在将钱(amount

26、)从一个帐户(ACCOUNTA)汇到另一个帐户(ACCOUNTB),假设表为(TACCOUNT),则 SQL 语句可能如下:UPDATE TACCOUNT SET money=money-amount WHERE account_name=ACCOUNTA;UPDATE TACCOUNT SET money=money+amountWHERE account_name=ACCOUNTB;这时如果第一条语句执行,帐户(ACCOUNTA)的钱已经汇出,但是由于某中异常第二条语句没有执行,那么帐户(ACCOUNTB)就收到从帐户(ACCOUNTA)汇出的钱。这时就造成了数据的不一致,事务处理就可以解

27、决这个问题,我们只需要将上面的两条语句合并成一个事务处理来执行,两条语句要么都执行,要么都不执行,这样就数据的一致性。什么时候开始一个事务?一般事务开始有以下情况:Ø 当第一条 SQL 开始执行时Ø 是前一个事务结束以后的第一条 SQL 语句Ø 显式的调用 SET TRANSACTION 来开始一个事务。般是使用 COMMIT(提交)或 ROLLBACK(事务的)来标志的。详细的事务处理内容请参考相关的 PL/SQL 书籍,这里只是简单地介绍这几个命令。注意:LOCK TABLE 不仅用于锁定表,也可以用来锁定视图。当 LOCK TABLE 用来锁定视图的时候实际

28、上是锁定了组成视图的基础表。例如一个视图 VIEW1 是由 TABLE1 和TABLE2,组成则锁定 VIEW1 实际上是锁定 TABLE1 和 TABLE2 两个表,其 lockmode选项同时使用在 TABLE1 和 TABLE2 上。1437.4.1 Set TransactionSet Transaction 命令显式地开始一个事务,其语法如下:set Transaction Read onlyWrite onlyUse Rollback segment段名Read only:事务级读一致性:事务处理过程中只能够够看到事务处理前提交的事务。Read Write:语句级读一致性如:,不能

29、够其它操作。只能Set Transaction Read only; Select count (*) from ship;UPDATE departmentSET dept_name=软件开发部 WHERE dept_id=1;Commit;7.4.2 Commit 与 Rollback 命令COMMIT 语句为事务中的提交语句,它将缓冲区的内容写入数据库。由于我们使用DML 中的 INSERT、UPDATE、DELETE 语句更改表的时候,结果只是反映在缓冲区中,要最终把结果写入数据库,则需要运行这个 COMMIT 语句。Rollback 命令则正好相反。如:INSERT INTO emp

30、loyee VALUES (6,ROLLBACK;,4,3800,嵩山);INSERT INTO employee VALUES (7,莫大先生,5,3800,衡山);Commit;7.4.3 Save point(保存点)在实际的工作中,有的时候我们可能不希望一个很大的事务,而是将一个大的事务分成很多小块,每一个小块作为一个保存点,这样当我们在执行程序的时候,如果发生错误,也只是到最近或指定的保存点。这在大量的多步更新时很有帮助。当程序发生错误时,ORACLE 只是到最近的保存点,而不是撤消整个事务,这样就不用再次处理保存点以前的语句,减少不必要的数据库开销。SAVEPOINT 的语法一般是

31、这样:SAVEPOINT pointname;144如果我们定义了一个保存点以后,就可以用下面的语法将一个事务撤消到该保存点:ROLLBACK TO SAVEPOINT pointname;如:BEGINSavepoint sp1 ;update employee set salary=5000 Where name=令狐冲; Savepoint sp2 ;update employee set salary=3000 Where name=岳不群; Rollback to savepoint sp2;Commit;END;/7.5会话命令与系统命令命令有 ALTER会话命令可动态地一个用户会

32、话的特性。主要的会话SESSION 命令和 SET ROLE 命令。7.5.1 Alter Session 命令ALTER SESSION 命令的作用可按下列方式更改当前会话:Ø 使 SQL 跟踪功能启用或停用。Ø 改变 NLS 参数值。Ø 改变会话的缺省标号格式。Ø 关闭一数据库链。个忠告到数据库,对一个悬而末决的分布式事务进行处理。¾¾或在过程或函数中发出 COMMIT 和 ROLLBACK 语句。Ø 修改基于开销的优化方法的目标。操作者为了实施使 SQL 跟踪功能启用或停用,或改变缺省标号格式执行该命令,则必须具有 A

33、LTER SESSION 系统语法:。执行其它操作不需要任何。ALTER SESSION SET paraname=value其中,paraname 指的是会话的参数变量名称;value 指的是会话的参数变量要设置的值。Oracle 系统的初始化参数有些是在数据库启动后不能够动态修改的,有些则是可以动态进行修改的。一般可以动态修改的初始化参数是通过会话命令的 ALTER SESSION 和系统命令的 ALTER SYSTEM 进行修改的。究竟哪些初始化参数可以进行修改,哪些不能够进行修改请参考相关的初始化参数的资料或者系统管理员手册。例一,启用 SQL 跟踪功能:ALTER SESSION S

34、ET SQL_TRACE=TRUE;145例二,修改 NLS 参数,设置语言为法语,日期格式YYYY MM DD HH24:MI:SS。ALTER SESSION SET NLS_LANGUAGE=French;ALTER SESSION SET NLS_DATE_FORMAT=YYYY MM DD HH24:MI:SS;例三,改变优化方法和目标来优化 SQL 语句,这些优化方法有:FIRST_ROW:最快响应时间; ALL_ROW:最大吞吐量; RULE:基于规则。语句如下:ALTER SESSION SET OPTIMIZER_GOAL=FIRST_ROW此外 ALTER SESSION

35、还可以关闭数据库链,提出事务忠告等。7.5.2 系统系统命令命令动态地管理一个 ORACLE 数据库实例的特性,该命令为 ALTER SYSTEM命令。其作用可以在下列方面动态地更改 ORACLE 数据库实例:使限制启用或停用。¾¾¾¾¾¾¾¾¾¾为共享服务器结构管理共享服务器进程或调度进程(dispatcher)。显式地转换日志文件组。显式地执行一个检查点。检验对数据文件的存取。限制用户对ORACLE 登录,仅使具有RESTRICTED SESSION 系统在单进程环境下使分布式恢复启用。手工

36、地归档日志文件组或者使自动归档启用成效不能。清除 SGA 的共享他中的全部数据。中止一个会话。的用户登录。ALTER SYSTEM 命令语法如下: 语法:ALTER SYSTEMSET paraname=value|ENABLE|DISABLERESTRICTED SESSION|FLUSH SHARED_POOL|SWITCH LOGFILE|ARCHIVE LOG archive_log_clause|KILL SESSION integer1,integer2其中,paraname 指的是系统动态参数变量名称;value 指的是系统动态变量要设置的值。这里的动态参数是初始化参数中可以利用

37、 ALTER SYSTEM 命令在数据库启动后进行动态更改的参数。ENABLE|DISABLERESTRICTED SESSION:确定是否限制用户对 ORACLE 登录,146ENABLE 仅使具有RESTRICTED SESSION 系统的用户登录。DISABLE 则取消这个限制。FLUSH SHARED_POOL:清除 SGA 共享池。SWITCH LOGFILE:强行日志转换。ARCHIVE LOG archive_log_clause:手工地归档日志文件组或者使自动归档启用成效不能。KILL SESSION integer1,integer2:杀死会话,其中 integer1 为会话

38、的 SID,integer2 为会话的序列号。例一,清除 SGA 共享池:ALTER SYSTEM FLUSH SHARED_POOL;例二,设置共享服务器进程数量最小为 25:Alter system set MTS_servers =25例三,动态调整调度进程数,对 TCP/IP协议量 5 对 DECNET 量 10:Atler system set MTS_Dispatchers =TCP,5MTS_Dispatchers =DECNET,10例四,动态设置使用限制:Alter system Set license_Max_Sessions=64; Alter system Set Li

39、cense_Sessions_Wanning=54;例五,终止会话,首先查找会话的 SID 以及序号,然后再终止会话:select sid, serial#, username from V$session;alter system kill session 13,8;-sid=13, serial=87.5.3 SET ROLE 命令SET ROLE 命令作用为使对当前会话启用或停用。在用户登录时,ORACLE 通过该用户的缺省为用户建立缺省域。该缺省域包含所有显式地授给用户的全部以及该用户的缺省的域中的全部。用户可执行缺省域中的所的任何操作。但不能够使用非缺省的。在会话期间,利用 SET

40、ROLE 命令改变用户的特权域,可改变对当前会话启用的,可在一会话期间改变启用多次。但操作者执行该命令时该必须已被。SET ROLE 命令还将的第十章 数据库安全管理中介绍。SET ROLE 命令基本语法如下:SET ROLE role IDENTIFIED BY passwordrole IDENTIFIED BY password,.|ALL EXCEPT role|NONE其中:role:使其对当前会话启用的名,任何没有别出的对当前会话是为停用。启用时必须提供口令。Password:为这个ALL EXCEPT:使的口令,如果给用户的全部有口令,使该在当前会话中启用,除了那些在 EXCEP

41、T 子句中列出的。在 EXCEPT 子句中列出的必须是直接给用户的,不能是间接的。注意不能使用这种方式使具有口令的启用。147NONE:使当前会话中全部停用。要改变用户的缺省,使用 ALTER USER 命令实现。例一,使当前用户可以使用其被授予的但不是缺省的role1,其中令 tiger 标识。SET ROLE role1 IDENTIFIED BY tiger;role1 使用口例二,使当前用户可以使用除了 BANKERSET ROLE EXCEPT BANKER;外的所有:7.6 PL/SQL 基础7.6.1 PL/SQL 块结构在 PL/SQL 中,所有的块都包含有下面的三个基本部分:

42、申明部分(declarative section)、执行部分(executable section)和异常处理部分(exception section)。其中只有执行部分是必须的,其它部分都是可选的。下面给出含有三个基本部分的一个块的例子:DECLARE/* 申明部分。所有的变量、游标和类型都在这里申明 */* 申明一个NUMBER型的变量v_ncolumn,并赋予初始值6 */ v_ncolumn NUMBER:=6;v_vcolumn VARCHAR2(30); -申明一个VARCHAR2型的变量v_vcolumn BEGIN/* 执行部分 */SELECT vcolumn INTO v_

43、vcolumn FROM test_table WHERE ncolumn=v_ncolumn;DBMS_OUTPUT.PUT_LINE('The Message''s '|v_vcolumn);/* 异常处理部分 */ EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('没有找到匹配的数据');END;从上例中我们可以看出,在一个 PL/SQL 块中所要使用的变量、类型和游标等都是在声明部分进行。部分一般都是以关键字 DECLARE 开始的。部分也可以本地过程和函数,但是这些过程和函数只能

44、在该块中使用。关键字 DECLARE 在我们创建过程或函数的时候是不需要的,我们可以直接所需的变量和类型等。但是在触发器中,如果要申明变量的话,DECLARE 则是必须要有的。部分是可选的,如果在 PL/SQL 块中我们不需要变量、类型和游标等,则148部分可以省略。如果没有申明部分,则块就是以关键字 BEGIN 开始。在块的执行部分,我们可以使用 SQL 语句和/或过程性语句来完成和处理特定的工作。在块的三个基本结构中,只有执行部分是不可缺少的,执行部分一般是以 BEGIN 开头,而以END 结束。如上例中我们用一条 SQL 语句从数据库表 test_table 中取出复合条件的 vcolu

45、mn, 然后用 DBMS_OUTPUT 方法在屏幕上打印出来。异常处理部分在一个 PL/SQL 块中是可选的,在异常处理部分,我们可以检查及处理在块中可能发生的错误。如果我们在一个块中不需要进行异常处理的话,那么异常处理部分可以省略。在块中,异常处理部分是以 EXCEPTION 关键字开始的。PL/SQL 的异常在 7.8 节将详细介绍。综上所述。我们对 PL/SQL 块有了一个具体的概念。知道 部分是由关键字 DECLARE开始的,而执行部分是由 BEGIN 来界定的,如果一个块中没有部分则这个块就直接由关键字 BEGIN 开始。并且我们知道在子程序这样的块中象过程或函数中部分是不需要关键字

46、 DECLARE 的。还了解到异常部分是由关键字 EXCEPTION 开始的,并且一个块中如果没有异常处理的话,则关键字 EXCEPTION 也就被省略。关键字 END 用来标志当前块的结束, 同时要注意的是:在 END 关键字后面一定要加上一个分号(;),这是必须的。这样一个块的框架结构应该是这样:DECLARE/* 这里是申明部分 */ BEGIN/* 这里是执行部分 */ EXCEPTION/* 这里是异常处理部分 */END; -在这里分号是必须的如果一个BEGIN块中没有部分,则是这样:/* 这里是执行部分 */ EXCEPTION/* 这里是异常处理部分 */END; -在这里分号

47、是必须的7.6.2 PL/SQL 变量类型每一个常量、变量和参数数据类型(或类型)。它用来指定一定的格式、约束和有效的范围。PL/SQL 提供了多种的的数据类型。例如:整数型、日期型、集合型、型和 LOB 类型等。另外,PL/SQL 可以让你定义中列处了所有的 PL/SQL 类型(图 7-1):、字符型、的子类型。下图149图 7-1 PL/SQL 变量类型由上图可以看到(composite type)、PL/SQL 类型分为四类:标量类型(scalar type)、复合类型类型(reference type)和 LOB 类型。标量类型不含有任何组件;复合类型可以包含有很多的组件;对象。类型是

48、指向另一个类型的指针;LOB 类型用来大型的在本章中,我们只介绍标量类型。一数字型数字类型可以让我们数字型数据(整形、实数型和浮点型)。它有三种基本类型:BINARY_INTEGER、NUMBER 和 PLS_INTEGER。1. NUMBERLOB 型BFILE BLOB CLOB NCLOB型REF CURSORREF object_type复合型RECORD TABLE VARRAY标量类型型BOOLEAN日期型DATEINTERVAL DAY TO SECOND INTERVAL YEAR TO MONTH TIMESTAMPTIMESTAMP WITH LOCAL TIME ZONE

49、 TIMESTAMP WITH TIME ZONE字符型CHAR CHARACTER LONGLONG RAW NCHAR NVARCHAR2 RAW ROWID STRING UROWID VARCHAR VARCHAR2数字型BINARY_INTEGER DECDECIMALDOUBLE PRECISION FLOATINT INTEGER NATURAL NATURALN NUMBER NUMERICPLS_INTEGER POSITOVE POSITIVEN REAL SIGNTYPESMALLINT150NUMBER 数据类型用来整数和符点数。它的范围是 1E-130 . 10E12

50、5。我们可以用数字来指定精度和刻度范围。精度是指数值中所有数字的个数,刻度是指小数点右边的数字的个数,如果给定的刻度范围是负数的话就由小数点开始向左边计算数字的个数。其语法就象下面这样:NUMBER(precision,scale)其中(precision,scale)是可选的,但是如果是固定刻度范围的数的话,则(precision,scale)是必须的。如果申明的是一个整数型的话,则可以这样:NUMBER(precision)。它和NUMBER(precision,0)是等价的。刻度用来确定在什么地方进行舍入,它的范围是从-84 到 127。如果被指派的值超过了指定的刻度范围,则值会按照刻度

51、指定的位数进行四舍五入,如果给的刻度是负数的话则值会按照刻度指定的位数往左进行四舍五入。如一个 NUMBER(8,3)类型的值为 12345.678。如果转换为 NUMBER(4,-2)类型,则值为 12300。PL/SQL 给 NUMBER 类型预定义了下面几类型:DEC、DECIMAL、DOUBLE、RECISION、FLOAT、INTEGER、INT、NUMERIC、REAL、SMALLINT2. BINARY_INTEGER我们可以用 BINARY_INTEGER 来一个有符号的整形值。它的大小范围是-2*31 .2*31(-2 的 31 次方到+2 的 31 次方)。和 PLS_IN

52、TEGER 值一样,BINARY_INTEGER 值所的空间比 NUMBER 值需要的空间少,然而,大多数情况下 BINARY_INTEGER需操作比 PLS_INTEGER 操作慢。子类型来源于数据类型,是数据类型的子集代表着数据类型的特殊情况,一般其取值范围较父数据类型为小。为了方便起见,PL/SQL 预定义了下面几个 BINARY_INTEGER 的子集: NATURAL、NATURALN、POSITIVE、POSITIVEN、SIGNTYPE。3.PLS_INTEGER我们可以使用 PLS_INTEGER 来一个有符号的整型值。和 BINARY_INTEGER一样它的精度范围是-2*3

53、1 . 2*31(-2 的 31 次方到+2 的 31 次方)。和 NUMBER 比较起来,PL_INTEGER 占有较少的空间,并且 PLS_INTEGER 可以直接进行算术运算(在 NUMBER 上不能直接进行算术运算,如果要这样的话 NUMBER 首先必须被转变成二进制),所以在进行算法的时候他比 NUMBER 和 BINARY_INTEGER 操作起来要块一点。所以在它的精度范围内使用 PLS_INTEGER 进行所有的运算操作是最合适的。二字符型字符类型可以让我们1.CHAR文字型数据,描述性词组和文本,并且可以让我们操作字符串。我们可以用 CHAR 数据类型来固定长度的字符数据。具

54、体有多少数据被要依赖于数据库的字符集。CHAR 有一个可选的参数让你来指定字符的长度,最大有 32767 个字节。其语法就象下面这样:CHAR(um_size CHAR | BYTE )151其中um_size 是指定的字符长度。CHAR 和 BYTE 为可选项,用来指定um_size 是以字节(BYTE)为还是以字符(CHAR)为,一个字符可以包括um_size 必须要用 1.32767 之间的整数一个或多个的字节,这取决于你的字符集设置。来指定。如果没有指定最大值,它缺省的是。尽管 PL/SQL 字符变量可以很长,但是数据库中 CHAR 类型的长度只有 2000 个字节。所以我们不能将大于 2000 个字节的字符数据库的字符列中。但是我们可以将任何的CHAR(n)值到一个 LONG 型的数据库列中,因为一个 LONG 数据库列的最大长度可以有2*31(2 的 31 次方)个字节。CHAR 有一个子类型为:CHARACTER。它的意义和 CHAR 完全一样

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论