SlideShare uma empresa Scribd logo
1 de 267
Baixar para ler offline
第一章 Oracle  入门
课程地位 .Net & C# SQL Server XML SPM ASP.NET & WebService Oracle UML SPR: Computer Base HTML&JavaScript SQL Server Base OOP&Java Base C STB JSP /Servlet EJB&WebService WinForms Struts&JSF Testing&SQA Linux
课程目标 ,[object Object],[object Object],[object Object],[object Object],[object Object]
目标   ,[object Object],[object Object],[object Object],[object Object]
Oracle  数据库简介  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle  数据库简介  2-2 ,[object Object],客户端应用程序通过向服务器请求并接收信息的方式与数据库进行交互。它充当用户与数据库之间的接口 请求  响应 数据库服务器对数据库表进行最佳管理,处理多个客户端对同一数据的并发访问。全面地保持数据完整性,并控制数据库访问权限等安全性需求 网络 服务器
Oracle 9i  体系结构 Oracle  服务器  Oracle  数据库  Oracle  实例 Oracle  数据库是一个数据的集合,该集合被视为一个逻辑单元 管理数据库的后台进程和内存结构的集合称为  Oracle  实例  ,[object Object],[object Object]
Oracle  主要组件  实  例 内存结构 后台进程 PMON  SMON  DBWR  LGWR  CKPT  其他 数据库 数据文件 数据文件 数据文件 控制文件 控制文件 日志文件 日志文件 参数文件 归档日志文件 口令文件 SGA 用户进程 服务器进程 PGA 共享池 数据缓冲区 日志缓冲区
Oracle  实例  ,[object Object],Oracle  实例  系统全局区  后台进程  分配  启动
Oracle  数据库 ,[object Object],[object Object],物理结构  逻辑结构  物理结构包含数据库中的一组操作系统文件。 逻辑结构指数据库创建之后形成的逻辑概念之间的关系 Oracle  数据库
会话 ,[object Object],[object Object],[object Object],启动  Oracle  实例 使用 SQL*Plus 连接 至数据库 创建用户进程 创建服务器进程 提交  SQL  查询
Oracle  实例内存结构 系统全局区  (SGA)  程序全局区  (PGA)  Oracle  实例启动时分配系统全局区 当服务器进程启动时分配程序全局区 ,[object Object],内存区
系统全局区  2-1 ,[object Object],共享池  数据缓冲区  日志缓冲区  SGA 的内存结构
系统全局区  2-2 共享池  ,[object Object],[object Object],[object Object],数据缓冲区  ,[object Object],[object Object],[object Object],日志缓冲区  ,[object Object],[object Object],[object Object]
程序全局区 ,[object Object],[object Object],[object Object]
Oracle  实例进程结构 ,[object Object],实例进程 用户进程  服务器进程  后台进程  用户进程是一个需要与 Oracle 服务器进行交互的程序。当用户运行一个应用程序准备向数据库服务器发送请求时,即创建了用户进程 服务器进程用于处理连接到该实例的用户进程的请求。当用户连接至  Oracle  数据库实例创建会话时,即产生服务器进程  后台进程是 Oracle 数据库为了保持最佳系统性能和协调多个用户请求而设置的。  Oracle  实例启动时即创建一系列后台进程
后台进程  2-1 后台进程 PMON ,[object Object],SMON DBWR LGWR CKPT 其他
后台进程  2-2 PMON  进程监控进程 ,[object Object],[object Object],[object Object],SMON  系统监控进程 ,[object Object],[object Object],[object Object],DBWR  数据写入进程 ,[object Object],[object Object],LGWR  日志写入进程 ,[object Object],[object Object]
Oracle  物理组件 ,[object Object],物理组件 数据文件  控制文件 日志文件 数据文件用于存储数据库数据,如表、索引数据等。 控制文件是记录数据库物理结构的二进制文件。 日志文件记录对数据库的所有修改信息,用于故障恢复
Oracle  逻辑组件  3-1 ,[object Object],数据库  表空间  段  区  数据块  模式
Oracle  逻辑组件  3-2 ,[object Object],[object Object],[object Object],CREATE TABLESPACE tablespacename DATAFILE ‘filename’ [SIZE integer [K|M]]  [AUTOEXTEND [OFF|ON]]; ,[object Object]
Oracle  逻辑组件  3-3 段 ,[object Object],[object Object],区 ,[object Object],[object Object],[object Object],数据块 ,[object Object],[object Object],模式 ,[object Object],[object Object]
Oracle  网络配置  2-1 ,[object Object],[object Object],tnsnames.ora Oracle  客户端 listener.ora Oracle  服务器
Oracle  网络配置  2-2 ,[object Object],[object Object],[object Object]
Oracle  查询工具  Oracle  查询工具 SQL*Plus iSQL*Plus PL/SQL ,[object Object],SQL*Plus 是 Oracle 最常用的工具之一,用于接受和执行 SQL 命令以及 PL/SQL 块。  iSQL*Plus 可以执行能用 SQL*Plus 完成的所有任务。该工具的优势在于能通过浏览器访问它。  PL/SQL  是  SQL  的扩展。 PL/SQL  结合了 SQL 语言的数据操纵能力和过程语言的流程控制能力
Oracle  企业管理器  ,[object Object]
Oracle  默认用户 ,[object Object],[object Object],Oracle  默认用户 SYS SYSTEM SCOTT 数据库中所有数据字典表和视图都存储在  SYS  模式中。 SYS 用户主要用来维护系统信息和管理实例。 SYSTEM  是默认的系统管理员,该用户拥有 Oracle 管理工具使用的内部表和视图。通常通过 SYSTEM 用户管理数据库用户、权限和存储等 SCOTT 用户是 Oracle  数据库的一个示范帐户,在数据库安装时创建
创建新用户 ,[object Object],[object Object],[object Object],CREATE USER username IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace]; ,[object Object],CREATE USER MARTIN IDENTIFIED BY martinpwd DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP; 创建一个名称为  martin  的用户,其密码为  martinpwd
授予权限  3-1 ,[object Object],[object Object],[object Object],[object Object],[object Object]
授予权限  3-2 ,[object Object],GRANT CONNECT TO MARTIN;  CONNECT 角色允许用户连接至数据库, 并创建数据库对象 GRANT RESOURCE TO MARTIN;  RESOURCE 角色允许用户使用 数据库中的存储空间 GRANT CREATE SEQUENCE TO MARTIN;  此系统权限允许用户在当前模式中创建 序列,此权限包含在 CONNECT 角色中
授予权限  3-3 ,[object Object],GRANT SELECT ON TEST TO MARTIN;  允许用户查询  TEST  表的记录 GRANT UPDATE ON TEST TO MARTIN;  允许用户更新  TEST  表中的记录 GRANT ALL ON TEST TO MARTIN;  允许用户插入、删除、更新和查询  TEST  表中的记录
更改和删除用户 ,[object Object],ALTER USER MARTIN IDENTIFIED BY martinpass; 修改  MARTIN  用户的密码 ,[object Object],DROP USER MARTIN CASCADE;  删除  MARTIN  用户模式
Oracle 9i  的安装和卸载 ,[object Object],选择  Oracle 9i Database 9.2.0.1.0  来安装数据库服务器。  选择  Oracle 9i Client 9.2.0.1.0  来安装  Oracle  客户端  启动 Universal Installer ,选择“卸装产品…”,选中要卸载的组件
使用  Oracle  数据库的开发流程 服务器端 安装  Oracle  服务器软件 创建数据库 ( 安装时自动创建 ) 配置监听器 ( 安装时自动配置 ) 启动 Oracle 实例 ( 自动启动服务 ) 安装  Oracle  客户端软件 配置网络服务名 以新用户登录  Oracle 提交  SQL  查询 创建新用户并授权 创建用户表空间 客户端
Windows  中的  Oracle  服务  3-1 ,[object Object],[object Object],[object Object]
Windows  中的  Oracle  服务  3-2 OracleHOME_NAMETNSListener ,[object Object],[object Object],OracleServiceSID ,[object Object],OracleHOME_NAMEAgent  ,[object Object],[object Object]
Windows  中的  Oracle  服务  3-3 OracleHOME_NAMEHTTPServer ,[object Object],OracleHOME_NAMEManagementServer ,[object Object],[object Object]
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第二章 SQL  查询和  SQL  函数
[object Object],[object Object],[object Object],[object Object],[object Object],回顾
目标 ,[object Object],[object Object],[object Object],[object Object]
SQL  简介  2-1 ,[object Object],[object Object],[object Object],[object Object],发送  SQL  查询 SELECT ename FROM Emp ; Oracle  服务器 MARTIN DAVID   ALLEN   SMITH   BLAKE ename 发送命令输出到用户端 用户
SQL  简介  2-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],数据定义语言  CREATE ALTER DROP 数据操纵语言  INSERT SELECT DELETE UPDATE 事务控制语言 COMMIT SAVEPOINT ROLLBACK 数据控制语言  GRANT REVOKE
Oracle  数据类型  5-1 ,[object Object],[object Object],数据类型 字符 数值 日期时间 RAW/LONG RAW LOB
Oracle  数据类型 5-2 字符数据类型 CHAR VARCHAR2 LONG ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle  数据类型  5-3 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle  数据类型  5-4 ,[object Object],[object Object],[object Object],[object Object],LOB ,[object Object],[object Object],BLOB CLOB BFILE CLOB  即  Character LOB (字符  LOB ),它能够存储大量字符数据 BLOB  即  Binary LOB (二进制  LOB ),可以存储较大的二进制对象,如图形、视频剪辑和声音文件  BFILE  即  Binary File (二进制文件),它用于将二进制数据存储在数据库外部的操作系统文件中
Oracle  数据类型  5-5  ,[object Object],[object Object],[object Object],ROWID  是表中行的存储地址,该地址可以唯一地标识数据库中的一行,可以使用  ROWID  伪列快速地定位表中的一行 ROWNUM  是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数
数据定义语言 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
数据操纵语言  ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DML – SELECT  命令  2-1 ,[object Object],[object Object],[object Object],[object Object],SQL> CREATE TABLE newitemfile AS SELECT * FROM itemfile; SQL> CREATE TABLE newitemfile1  AS SELECT itemcode, itemdesc, qty_hand  FROM itemfile; SQL> CREATE TABLE newitemfile2  AS SELECT * FROM itemfile WHERE 1 = 2;
DML – SELECT  命令  2-2 SQL> SELECT DISTINCT vencode FROM vendor_master; ,[object Object],[object Object],[object Object],[object Object],[object Object],SQL> SELECT itemcode, itemdesc, max_level,  max_level*2 AS NEW_MAXLEVEL  FROM itemfile; SQL> SELECT itemcode,itemdesc, max_level, max_level* 2 “New Maximum Level”  FROM itemfile;
DML – INSERT  命令  2-1 ,[object Object],[object Object],[object Object],[object Object],INSERT INTO my_table (date_col) VALUES (TO_DATE('2005-10-18', 'YYYY-MM-DD')); INSERT INTO order_master  VALUES('o001', '12-5 月 -05', 'V002', 'c', '25-5 月 -05');
DML – INSERT  命令  2-2 ,[object Object],[object Object],[object Object],[object Object],SQL> INSERT INTO newvendor_master SELECT * FROM vendor_master;  SQL> INSERT INTO newvendor_master(vencode,venname)  SELECT vencode, venname FROM vendor_master;
事务控制语言 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],SQL>  UPDATE order_master  SET del_date = ‘30-8 月 -05’  WHERE orderno <= ’o002’; SQL>  SAVEPOINT mark1; SQL>  DELETE FROM order_master WHERE orderno = ‘o002’; SQL>  SAVEPOINT mark2; SQL>  ROLLBACK TO SAVEPOINT mark1; SQL>  COMMIT;
数据控制语言 ,[object Object],[object Object],[object Object],[object Object],SQL> GRANT SELECT, UPDATE ON order_master TO MARTIN; SQL> GRANT UPDATE(qty_hand, re_level)  ON itemfile TO MARTIN; SQL> GRANT SELECT ON vendor_master  TO accounts WITH GRANT OPTION; SQL> REVOKE SELECT, UPDATE ON order_master FROM MARTIN;
SQL  操作符 SQL  操作符 集合操作符 逻辑操作符 比较操作符 算术操作符 连接操作符 ,[object Object]
算术操作符 ,[object Object],[object Object],[object Object],SQL> SELECT itemdesc, max_level - qty_hand avble_limit  FROM itemfile WHERE p_category='spares'; SQL > SELECT itemdesc, itemrate*(max_level - qty_hand) FROM itemfile  WHERE p_category='spares';
比较操作符  ,[object Object],[object Object],SQL> SELECT itemdesc, re_level FROM  itemfile WHERE qty_hand < max_level/2; SQL> SELECT orderno FROM order_master  WHERE del_date IN (‘06-1 月 -05’,‘05-2 月 -05'); SQL> SELECT vencode,venname,tel_no  FROM vendor_master  WHERE venname LIKE 'j___s';
逻辑操作符 ,[object Object],[object Object],SQL> SELECT * FROM order_master  WHERE odate > ‘10-5 月 -05'  AND del_date < ‘26-5 月 -05’; 显示  2005-5 月 -10  至  2005-5 月 -26 的订单信息
集合操作符 ,[object Object],集合操作符 UNION UNION ALL INTERSECT MINUS INTERSECT  操作符只返回两个查询的公共行。 SQL> SELECT orderno FROM order_master  INTERSECT  SELECT orderno FROM order_detail; SQL> SELECT orderno FROM order_master  MINUS SELECT orderno FROM order_detail; MINUS  操作符返回从第一个查询结果中排除第二个查 询中出现的行。
连接操作符 ,[object Object],SQL> SELECT (venname|| '  的地址是  ' ||venadd1||' '||venadd2 ||' '||venadd3) address FROM vendor_master WHERE vencode='V001'; 通过使用连接操作符可以将表中 的多个列合并成逻辑上的一行列
操作符的优先级 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
SQL  函数 ,[object Object],[object Object],[object Object],SQL  函数 单行函数 分析函数 分组函数
单行函数分类 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
日期函数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
字符函数  2-1 字符函数 ,[object Object],Hello world Select concat (‘Hello’,’ world’) from dual;   Concat (expr1, expr2)   cd  Select substr(‘abcdefg’,3,2) from dual;   Substr (char, m, n)   5   Select instr (‘worldwide’,’d’) from dual;   Instr (char, m, n)   black and blue   Select replace(‘jack and jue’ ,’j’,’bl’) from dual; Replace(char, searchstring,[rep string])   Select translate(‘jack’,’j’ ,’b’) from dual;   Select rtrim(‘xyzadams’,’ams’) from dual;   Select ltrim( ‘xyzadams’,’xyz’) from dual;  Select upper(‘sun’) from dual; Select lower(‘FUN’) from dual; Select initcap(‘hello’) from dual; 输入 adams Ltrim(char,set)   xyzad   Rtrim(char,set)   back   Translate(char, from, to)   fun   Lower(char)   Hello   Initcap(char)   SUN   Upper(char)   输出 函数
字符函数  2-2 SQL> SELECT CHR(67) FROM dual; ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],SQL> SELECT LPAD(‘function’,15,’=’) FROM dual; SQL> SELECT TRIM(9 from 9999876789999) FROM dual; SQL> SELECT LENGTH('frances') FROM dual; SQL> SELECT vencode,  DECODE(venname,'frances','Francis') name  FROM vendor_master WHERE vencode='v001';
数字函数 ,[object Object],数字函数 -1 Select sign(-30) from dual; Sign(n) 2   Select sqrt(4) from dual;   Sqrt(n)   100.25   Select trunc(100.256,2) from dual;   Trunc(m,n)   100.26   Select round(100.256,2) from dual;   Round(m,n)   1 Select mod(10,3) from dual;   Mod(m,n)   16   Select power(4,2) from dual;   Power(m,n)   Select floor(100.2) from dual;   Select cosh(0) from dual;   Select cos(180) from dual;   Select ceil(44.778) from dual;   Select abs(-15) from dual;   输入 1 Cosh(n)   100 Floor(n)   45 Ceil(n)   15 Abs(n)   -.5984601   Cos(n)   输出 函数
转换函数 ,[object Object],[object Object],[object Object],[object Object],[object Object],SELECT TO_CHAR(sysdate,'YYYY&quot; 年 &quot;fmMM&quot; 月 &quot;fmDD&quot; 日 &quot; HH24:MI:SS') FROM dual;      SELECT TO_CHAR(itemrate,‘C99999’) FROM itemfile;   SELECT TO_DATE(‘2005-12-06’ , ‘yyyy-mm-dd’) FROM dual; SELECT TO_NUMBER('100') FROM dual;
其它函数 ,[object Object],[object Object],[object Object],[object Object],SELECT itemdesc, NVL(re_level,0) FROM itemfile; SELECT itemdesc, NVL2(re_level,re_level,max_level)  FROM itemfile; SELECT itemdesc, NULLIF(re_level,max_level)  FROM itemfile;
分组函数 ,[object Object],[object Object],AVG MIN MAX SUM COUNT SELECT AVG(re_level) FROM  itemfile  WHERE p_category='accessories'; SELECT MAX(max_level) FROM  itemfile; SELECT SUM(itemrate*max_level) FROM itemfile; SELECT COUNT(*) FROM itemfile; SELECT COUNT(itemrate) FROM itemfile;  SELECT COUNT(DISTINCT qty_hand) FROM itemfile; 分组函数
GROUP BY 和 HAVING 子句 ,[object Object],[object Object],[object Object],[object Object],[object Object],SELECT p_category, MAX(itemrate) FROM itemfile GROUP BY p_category; SELECT p_category, MAX(itemrate) FROM itemfile GROUP BY p_category HAVING p_category NOT IN ('accessories');
分析函数  2-1 ,[object Object],[object Object],[object Object],分析函数 DENSE_RANK RANK ROW_NUMBER
分析函数  2-2 ,[object Object],[object Object],[object Object],[object Object],SELECT ename, job, deptno, sal, ROW_NUMBER() OVER  (ORDER BY sal DESC) AS SAL_RANK  FROM SCOTT.EMP; SELECT deptno, ename, sal, comm, RANK() OVER  (PARTITION BY deptno ORDER BY sal DESC, comm) RANK FROM emp;  SELECT d.dname, e.ename, e.sal, DENSE_RANK() OVER (PARTITION BY e.deptno ORDER BY e.sal DESC) AS DENRANK FROM emp e, dept d WHERE e.deptno = d.deptno;
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第三章  锁和表分区
回顾 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
目标 ,[object Object],[object Object]
锁的概念  2-1 ,[object Object],[object Object],[object Object]
锁的概念  2-2 修改表 修改表 拒绝访问 Price Name Toy_ID GI Joe Barbie 45 T002 20 T001
锁定的优点 ,[object Object],[object Object],[object Object],修改表中 的数据 查看表中的数据 允许访问 Price Name Toy_ID GI Joe Barbie 45 T002 20 T001
锁的类型 表级锁 行级锁 锁的类型
行级锁  3-1 更新  T002  行 更新  T001  行 行被锁定 ,[object Object],允许访问 GI Joe Barbie Name 45 T002 20 T001 Price Toy_ID
行级锁  3-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
行级锁  3-3 ,[object Object],[object Object],SQL> SELECT * FROM order_master WHERE vencode=’V002’ FOR UPDATE OF odate, del_date; SQL> UPDATE order_master SET del_date=’28-8 月 -05’ WHERE vencode=’V002’; SQL> COMMIT; SQL> SELECT * FROM order_master WHERE vencode=’V002’ FOR UPDATE WAIT 5; SQL> SELECT * FROM order_master WHERE vencode=’V002’ FOR UPDATE NOWAIT;
表级锁  3-1 修改表中的行  更新表  拒绝访问 锁定整个表,限制其他用户对表的访问。 GI Joe Barbie Name 45 T002 20 T001 Price Toy_ID
表级锁  3-2 ,[object Object],[object Object],表级锁类型 行共享 行排他 共享 共享行排他 排他
表级锁  3-3 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
死锁 ,[object Object],[object Object],[object Object],T 1 T 2 lock  (D 1 ) 时间 lock  (D 2 ) lock  (D 2 ) lock  (D 1 ) 等待 等待 … …
表分区 ,[object Object],[object Object],[object Object],[object Object],更新表 只访问  P1 P1  分区 P2  分区 US California 9 th  Road Jack Jones US New York 53 rd  Road Jim Taylor US New York 12 th  Street Bob Simmons US New York LK Rd.  Micheal Clarke US California 34 th  Rd. John Smith Country State Address Name
表分区的类型  9-1 分区方法 范围分区 散列分区 列表分区 复合分区
表分区的类型  9-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
表分区的类型  9-3 ,[object Object],SQL> CREATE TABLE Sales ( Product_ID varchar2 (5), Sales_Cost number (10) ) PARTITION BY RANGE (Sales_Cost) ( PARTITION P1 VALUES LESS THAN (1000), PARTITION P2 VALUES LESS THAN (2000), PARTITION P3 VALUES LESS THAN (3000) ); 根据  Sales_Cost  创建分区 分区的名称 包含销售成本低于 1000  的所有产品的值  SQL> CREATE TABLE SALES2 ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER(10)) PARTITION BY RANGE (SALES_DATE) ( PARTITION P1 VALUES LESS THAN (DATE ‘2003-01-01’), PARTITION P2 VALUES LESS THAN (DATE ‘2004-01-01’),  PARTITION P3 VALUES LESS THAN (MAXVALUE) );
表分区的类型  9-4 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
表分区的类型  9-5 ,[object Object],SQL> CREATE TABLE Employee ( Employee_ID varchar2 (5), Employee_Name varchar2(20), Department varchar2 (10) ) PARTITION BY HASH (Department) ( Partition D1, Partition D2, Partition D3 );  在表  Employee 上创建分区键  Department 分区的名称 创建  3  个分区 SQL> CREATE TABLE EMPLOYEE ( EMP_ID NUMBER(4), EMP_NAME VARCHAR2(14), EMP_ADDRESS VARCHAR2(15), DEPARTMENT VARCHAR2(10) ) PARTITION BY HASH (DEPARTMENT) PARTITIONS 4; 
表分区的类型  9-6 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
表分区的类型  9-7 ,[object Object],SQL> CREATE TABLE Employee ( Emp_ID number (4), Emp_Name varchar2 (14), Emp_Address varchar2 (15) ) PARTITION BY LIST (Emp_Address) ( Partition north values (‘ 芝加哥 '), Partition west values (‘ 旧金山’ , ‘ 洛杉矶 '), Partition south values (‘ 亚特兰大’ , ‘ 达拉斯’ , ‘ 休斯顿 '), Partition east values (‘ 纽约’ , ‘ 波斯顿 ') ); 包含住在芝加哥的职员的记录 根据职员住址在表上创建的列表分区 分区的名称
表分区的类型  9-8 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
表分区的类型  9-9 ,[object Object],SQL> CREATE TABLE SALES ( PRODUCT_ID VARCHAR2 (5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER (10) ) PARTITION BY RANGE (SALES_DATE) SUBPARTITION BY HASH (PRODUCT_ID) SUBPARTITIONS 5 ( PARTITION  S1  VALUES LESS THAN (TO_DATE(‘01/4 月 /2001', 'DD/MON/YYYY')), PARTITION  S2  VALUES LESS THAN (TO_DATE(‘01/7 月 /2001', 'DD/MON/YYYY')), PARTITION  S3  VALUES LESS THAN (TO_DATE(‘01/9 月 /2001', 'DD/MON/YYYY')), PARTITION  S4  VALUES LESS THAN (MAXVALUE) ); 创建的四个范围分区的名称 在表的  Sales_Date  列中创建范围分区 在表的  Product_ID  列创建散列子分区 在每个范围分区中 创建  5  个散列子分区
操纵已分区的表  ,[object Object],[object Object],INSERT INTO SALES3 VALUES (‘P001’, ’02-3 月 -2001', 2000); INSERT INTO SALES3 VALUES (‘P002’, ’10-5 月 -2001', 2508); INSERT INTO SALES3 VALUES (‘P003’, ’05-7 月 -2001', 780); INSERT INTO SALES3 VALUES (‘P004’, ’12-9 月 -2001', 1080); SELECT * FROM SALES3 PARTITION (P3); DELETE FROM SALES3 PARTITION (P2);
分区维护操作  ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
维护分区  2-1 ,[object Object],SQL> ALTER TABLE SALES ADD PARTITION P4 VALUES LESS THAN (4000); ,[object Object],SQL> ALTER TABLE SALES DROP PARTITION P4; ,[object Object],SQL> ALTER TABLE SALES TRUNCATE PARTITION P3;
维护分区  2-2 ,[object Object],SQL> ALTER TABLE SALES  MERGE PARTITIONS S1, S2 INTO PARTITION S2; ,[object Object],SQL> ALTER TABLE SALES SPLIT PARTITION P2 AT (1500) INTO (PARTITION P21, PARTITION P22);
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object]
第四章 数据库对象
回顾 ,[object Object],[object Object],[object Object],[object Object],[object Object]
目标 ,[object Object],[object Object],[object Object],[object Object]
数据库对象简介  ,[object Object],[object Object],[object Object],数据库对象   同义词 序列 视图 索引
同义词  3-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],同义词 私有同义词 公有同义词 私有同义词只能在其模式内访问,且不能与当前模式的对象同名。 公有同义词可被所有的数据库用户访问。
同义词  3-2 CREATE SYNONYM emp FOR SCOTT.emp; SCOTT.emp   的别名 模式名 表名 私有同义词 公有同义词 CREATE PUBLIC SYNONYM emp_syn FOR SCOTT.emp; 同义词名称
同义词  3-3 创建或替换现有的同义词 CREATE OR REPLACE SYNONYM emp_syn FOR SCOTT.emp; 替换现有的同义词 SQL> DROP SYNONYM emp;  SQL> DROP PUBLIC SYNONYM emp_syn;  删除同义词
序列 ,[object Object],[object Object],[object Object],SQL> CREATE SEQUENCE toys_seq START WITH 10 INCREMENT BY 10 MAXVALUE 2000 MINVALUE 10 NOCYCLE CACHE 10; 指定第一个序号从  10  开始 指定序号之间的间隔为  10 表示序列的最大值为  2000 表示序列的最小值为  10 在达到最大值后停止生成下一个值 指定内存中预先分配的序号数
访问序列 ,[object Object],[object Object],[object Object],SQL> INSERT INTO toys (toyid, toyname, toyprice)  VALUES ( toys_seq.NEXTVAL, ‘TWENTY’, 25); SQL> INSERT INTO toys (toyid, toyname, toyprice)  VALUES ( toys_seq.NEXTVAL, ’MAGIC PENCIL’, 75); 指定序列的下一个值 SQL> SELECT toys_seq.CURRVAL FROM dual; 检索序列的当前值
更改和删除序列 SQL> ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE; 使用 ALTER SEQUENCE 语句修改序列, 不能更改序列的 START WITH 参数 使用 DROP SEQUENCE 语句删除序列 SQL> DROP SEQUENCE toys_seq;
视图 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
创建视图  3-1 Stud_details Stud_view 创建视图 CREATE VIEW stud_view AS SELECT studno, studname, subno FROM Stud_details; Open 5 40 Jesica 3 SC 4 33 James 2 Open 2 45 Rob 1 studcaste subno studmarks studname studno 5 Jesica 3 4 James 2 2 Rob 1 subno studname studno
创建视图  3-2 ,[object Object],CREATE [OR REPLACE] [FORCE] VIEW view_name [(alias[, alias]...)]  AS select_statement [WITH CHECK OPTION] [WITH READ ONLY];
创建视图  3-3 ,[object Object],CREATE OR REPLACE VIEW pause_view AS SELECT * FROM order_master WHERE ostatus = 'p' WITH CHECK OPTION CONSTRAINT chk_pv; 使用  ORDER BY  子句创建视图 CREATE OR REPLACE VIEW ord_ven AS SELECT * FROM vendor_master ORDER BY venname; 创建带有错误的视图 CREATE FORCE VIEW ven AS SELECT * FROM venmaster;
联接视图  2-1 Stud_details Sub_details CREATE VIEW Stud_sub_view AS SELECT Studno, Studname, Submrks, Subname FROM Stud_details, Sub_Details  WHERE Stud_details.Subno=Sub_details.Subno; Stud_sub_view 联接视图 4 33 James 2 4 40 Jesica 3 2 45 Rob 1 Subno Submrks Studname Studno Science 5 Maths 4 English 2 Subname Subno English 45 Rob 1 Maths 40 Jesica 3 Maths 33 James 2 Subname Submrks Studname Studno
联接视图  2-2 创建外联接视图 CREATE VIEW ven_ord_outj_view AS SELECT vm.vencode, venname, orderno, odate, ostatus FROM  vendor_master vm, order_master om WHERE  vm.vencode = om.vencode(+); SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm LEFT OUTER JOIN order_master om ON vm.vencode = om.vencode;
视图上的 DML 语句 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
键保留表 Stud_details Sub_details 键保留表 因为  Studno  既是  Stud_details  中的主键, 也是联接结果中的主键  Stud_details  为什么 是键保留表? 联接视图 4 33 James 2 4 40 Jesica 3 2 45 Rob 1 Subno Submrks Studname Studno Science 5 Maths 4 English 2 Subname Subno Maths 4 40 Jesica 3 Maths 4 33 James 2 English 2 45 Rob 1 Subname Subno Submarks Studname Studno
[object Object],[object Object],视图中的函数 CREATE VIEW item_view AS  SELECT itemcode, LOWER(itemdesc) item_desc FROM itemfile;  SQL> DROP VIEW toys_view;
索引  3-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
索引  3-2 ,[object Object],索引的类型 基于函数的索引 反向键索引 位图索引 唯一索引 组合索引
索引  3-3 SQL> CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs; 创建标准索引 重建索引 SQL> ALTER INDEX item_index REBUILD;  删除索引 SQL> DROP INDEX item_index;
唯一索引 ,[object Object],[object Object],[object Object],SQL> CREATE UNIQUE INDEX item_index ON itemfile (itemcode);
组合索引 ,[object Object],[object Object],[object Object],SQL> CREATE INDEX comp_index ON itemfile(p_category, itemrate);
[object Object],[object Object],[object Object],反向键索引 SQL> CREATE INDEX rev_index  ON itemfile (itemcode) REVERSE; SQL> ALTER INDEX rev_index REBUID NOREVERSE;
位图索引 ,[object Object],[object Object],[object Object],[object Object],SQL> CREATE BITMAP INDEX bit_index ON order_master (orderno);
索引组织表  2-1 ,[object Object],[object Object],[object Object],[object Object],SQL> CREATE TABLE ind_org_tab ( vencode NUMBER(4) PRIMARY KEY, venname VARCHAR2(20) )  ORGANIZATION INDEX;
索引组织表  2-2 ,[object Object],不支持分区 支持分区 完全索引扫描返回所有行,并按主键顺序排列 顺序扫描返回所有行 基于主键的访问 基于  ROWID  的访问 没有隐式的  ROWID  列 隐式的  ROWID  列 主键唯一地标识行 ROWID  唯一地标识行 索引组织表 普通表
基于函数的索引 ,[object Object],[object Object],[object Object],[object Object],SQL> CREATE INDEX lowercase_idx  ON toys (LOWER(toyname)); SQL> SELECT toyid FROM toys WHERE LOWER(toyname)='doll';
索引中的分区 ,[object Object],[object Object],[object Object],[object Object],[object Object]
获取索引的信息 ,[object Object],[object Object],[object Object],[object Object],SQL> SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME FROM USER_IND_COLUMNS ORDER BY INDEX_NAME, COLUMN_POSITION;
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第五章 使用  PL/SQL
回顾 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
目标 ,[object Object],[object Object],[object Object],[object Object],[object Object]
PL/SQL  简介 ,[object Object],[object Object],[object Object],[object Object],[object Object]
PL/SQL  的优点  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],用户将整个语句块发送给  Oracle Oracle Procedure Begin ProcedureCall SQL Command … End
PL/SQL  的优点  2-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],PL/SQL SQL
PL/SQL  的体系结构 ,[object Object],[object Object],将 PL/SQL  块发送给  Oracle  服务器 用户 执行过程语句 引擎将  SQL  语句发送给 SQL  语句执行器 执行  SQL  语句 将结果发送给用户 Oracle  服务器 PL/SQL 引擎 SQL   语句 执行器 过程语句 执行器
PL/SQL  块简介 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],DECLARE qty_on_hand NUMBER(5); BEGIN SELECT quantity INTO qty_on_hand FROM Products WHERE product = ' 芭比娃娃 ' FOR UPDATE OF quantity; IF qty_on_hand > 0 THEN UPDATE Products SET quantity = quantity + 1 WHERE product = ' 芭比娃娃 '; INSERT INTO purchase_record VALUES (' 已购买芭比娃娃 ', SYSDATE); END IF; COMMIT; EXCEPTION  /*  异常处理语句  */ WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(' 出错 :'|| SQLERRM);  END; 声明部分定义变量、游标和自定义异常 包含  SQL  和  PL/SQL  语句的可执行部分 指定出现错误时需要执行的操作
变量和常量  1-2  ,[object Object],[object Object],[object Object],[object Object],[object Object],identifier  [CONSTANT]  datatype  [NOT NULL]  [:= | DEFAULT  expr ]; ,[object Object],[object Object],[object Object]
变量和常量  2-2 DECLARE icode VARCHAR2(6); p_catg VARCHAR2(20); p_rate NUMBER; c_rate CONSTANT NUMBER := 0.10; BEGIN ... icode := 'i205'; SELECT p_category, itemrate * c_rate INTO  p_catg, p_rate FROM itemfile WHERE itemcode = icode; ... END;
数据类型 ,[object Object],数据类型 LOB 类型 标量类型 属性类型 %ROWTYPE 数字 字符 布尔型 日期时间 BFILE BLOB CLOB NCLOB %TYPE 提供某个变量或数据库表列的数据类型 提供表示表中一行的记录类型  存储非结构化数据块
数字数据类型 ,[object Object],数字数据类型 NUMBER BINARY_INTEGER PLS_INTEGER NATURAL NATURALLN POSITIVE POSITIVEN DECIMAL FLOAT INTEGER REAL SIGNTYPE 存储有符号整数,所需存储空间少于 NUMBER 类型值 存储整数、实数和浮点数 存储有符号整数,可使算术计算快速而有效
字符数据类型 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],1..32767 1..4000 VARCHAR2 1..32767 1..2000 RAW 1..32760 1..2GB LONG RAW 1..32760 1..2GB LONG 1..32767 1..2000 CHAR PL/SQL 类型 SQL 类型 数据类型
日期时间和布尔数据类型 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
LOB  数据类型  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
LOB  数据类型  2-2 ,[object Object],[object Object],SET SERVEROUTPUT ON DECLARE clob_var  CLOB; amount  INTEGER; offset  INTEGER; output_var VARCHAR2(100); BEGIN SELECT chapter_text INTO clob_var  FROM my_book_text WHERE chapter_id=5; amount := 24;  --  要读取的字符数 offset := 1;  --  起始位置 DBMS_LOB.READ(clob_var,amount,offset,output_var); DBMS_OUTPUT.PUT_LINE(output_var); END; / 从表中选择  CLOB  定位符 到  clob_var 变量中 从 CLOB 数据中读取 24 个字符存储到  output_var  变量中 显示读到的信息
属性类型 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],icode itemfile.itemcode%TYPE; emp_rec scott.emp%ROWTYPE;
逻辑比较 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],比较两个变量,检查值  1  是否大于 值  2 > 比较两个变量,检查变量  1  是否小于等于变量  2 <= 比较两个变量,检查变量  1  是否大于等于变量  2 >= 比较两个变量,如果不相等,则返回  True <>, != 比较两个变量是否相等,如果值相当,则返回  True = 比较两个变量,检查值  1  是否小于值  2 < 说明 关系运算符
控制结构 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
条件控制  2-1 ,[object Object],DECLARE icode VARCHAR2(4); irate NUMBER; BEGIN icode := 'i203'; SELECT itemrate INTO irate FROM itemfile  WHERE  itemcode = icode; IF irate > 200 THEN UPDATE itemfile SET itemrate = itemrate - 200 WHERE itemcode = icode; ELSE UPDATE itemfile SET itemrate = itemrate - 50 WHERE itemcode = icode; END IF; DBMS_OUTPUT.PUT_LINE('itemrate='|| irate); END;
条件控制  2-2 BEGIN CASE ‘&grade’ WHEN ’A’ THEN DBMS_OUTPUT.PUT_LINE(’ 优异’ ); WHEN ’B’ THEN DBMS_OUTPUT.PUT_LINE ( 优秀’ ); WHEN ’C’ THEN DBMS_OUTPUT.PUT_LINE (’ 良好’ ); WHEN ’D’ THEN DBMS_OUTPUT.PUT_LINE (’ 一般’ ); WHEN ’F’ THEN DBMS_OUTPUT.PUT_LINE (’ 较差’ ); ELSE DBMS_OUTPUT.PUT_LINE (’ 没有此成绩’ ); END CASE; END; ,[object Object],[object Object]
循环控制 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],LOOP  sequence_of_statements END LOOP; WHILE condition LOOP  sequence_of_statements END LOOP; FOR counter IN [REVERSE] value1..value2 LOOP  sequence_of_statements END LOOP;
顺序控制 ,[object Object],[object Object],[object Object],[object Object],DECLARE qtyhand itemfile.qty_hand%type; relevel itemfile.re_level%type; BEGIN SELECT qty_hand,re_level INTO qtyhand,relevel FROM itemfile WHERE itemcode = 'i201'; IF qtyhand < relevel THEN GOTO updation; ELSE GOTO quit; END IF; <<updation>> UPDATE itemfile SET qty_hand = qty_hand + re_level WHERE itemcode = 'i201'; <<quit>> NULL; END;
动态  SQL ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],DECLARE sql_stmt VARCHAR2(200); emp_id NUMBER(4) := 7566; emp_rec emp%ROWTYPE; BEGIN EXECUTE IMMEDIATE  'CREATE TABLE bonus1 (id NUMBER, amt NUMBER)'; sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; END;
错误处理  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object]
错误处理  2-2 ,[object Object],[object Object],DECLARE  ordernum VARCHAR2(5); BEGIN SELECT orderno INTO ordernum FROM order_master; EXCEPTION  WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE (' 返回多行 '); END; DECLARE  invalidCATEGORY EXCEPTION; category VARCHAR2(10); BEGIN category := '&Category'; IF category NOT IN (' 附件 ',' 顶盖 ',' 备件 ') THEN RAISE invalidCATEGORY; ELSE DBMS_OUTPUT.PUT_LINE(' 您输入的类别是 '|| category); END IF; EXCEPTION WHEN invalidCATEGORY THEN DBMS_OUTPUT.PUT_LINE(' 无法识别该类别 '); END;
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],引发应用程序错误 DECLARE rate itemfile.itemrate%TYPE; rate_exception EXCEPTION; BEGIN SELECT NVL(itemrate,0) INTO rate FROM itemfile  WHERE  itemcode = 'i207'; IF rate = 0 THEN RAISE rate_exception; ELSE DBMS_OUTPUT.PUT_LINE(' 项费率为: ' || rate); END IF; EXCEPTION WHEN rate_exception THEN RAISE_APPLICATION_ERROR(-20001, ' 未指定项费率 '); END;
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第六章  游标管理
回顾 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
目标 ,[object Object]
游标简介  2-1 执行  PL/SQL  程序 内存单元 保存到游标中 一次处理一行 检索行 提取行 Oracle  服务器
游标简介  2-2 ,[object Object],[object Object],隐式游标 REF  游标 显式游标 在  PL/SQL  程序中执行 DML SQL  语句时自动创建隐式游标。  显式游标用于处理返回多行的查询。 REF  游标用于处理运行时才能确定的动态  SQL  查询的结果 游标类型
隐式游标  4-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
隐式游标  4-2 SQL> SET SERVEROUTPUT ON SQL> BEGIN UPDATE toys SET toyprice=270 WHERE toyid= 'P005'; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE(‘ 表已更新 '); END IF; END; / 只有在  DML  语句影响一行 或多行时,才返回  True
隐式游标  4-3 SQL> SET SERVEROUTPUT ON SQL> DECLARE v_TOYID TOYS.ID%type := '&TOYID'; v_TOYNAME TOYS.NAME%Type := '&TOYNAME'; BEGIN UPDATE TOYS SET NAME = v_TOYNAME WHERE toyid=v_TOYID; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE(' 编号未找到。 '); ELSE DBMS_OUTPUT.PUT_LINE(‘ 表已更新 '); END IF; END; / 如果  DML  语句不影响任何行,则返回  True
隐式游标  4-4 SQL> SET SERVEROUTPUT ON  SQL> BEGIN UPDATE vendor_master SET venname= 'Rob Mathew' WHERE vencode='V004'; DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT); END; / 返回  DML  语句影响的行数
SELECT INTO  语句  2-1 SQL> SET SERVEROUTPUT ON SQL> DECLARE  empid VARCHAR2(10); desig VARCHAR2(10); BEGIN empid:= '&Employeeid'; SELECT designation INTO desig  FROM employee WHERE empno=empid; EXCEPTION WHEN NO_DATA_FOUND THEN   DBMS_OUTPUT.PUT_LINE(' 职员未找到 '); END; / 如果没有与 SELECT INTO 语句中的条件匹配的行,将引发 NO_DATA_FOUND 异常
SELECT INTO  语句  2-2 SQL> SET SERVEROUTPUT ON SQL> DECLARE  empid VARCHAR2(10); BEGIN SELECT empno INTO empid FROM employee; EXCEPTION WHEN TOO_MANY_ROWS THEN   DBMS_OUTPUT.PUT_LINE(' 该查询提取多行 '); END; / 如果  SELECT INTO  语句返回多个值, 将引发 TOO_MANY_ROWS 异常
显式游标  2-1 ,[object Object],[object Object],数据库 打开游标 提取行 变量  关闭游标  30 George 3 44 Roger 2 45 James 1 Stud_mrks Stud_name stud_no
显式游标  2-2 SQL>SET SERVER OUTPUT ON SQL>DECLARE my_toy_price toys.toyprice%TYPE;   CURSOR toy_cur IS   SELECT toyprice FROM toys   WHERE toyprice<250; BEGIN   OPEN toy_cur;    LOOP   FETCH toy_cur INTO my_toy_price;   EXIT WHEN toy_cur%NOTFOUND;   DBMS_OUTPUT.PUT_LINE  ('TOYPRICE=: 玩具单价 = : '||my_toy_price);   END LOOP;   CLOSE toy_cur; END; 声明游标 打开游标 提取行 关闭游标
带参数的显式游标 ,[object Object],[object Object],[object Object],[object Object],SQL> SET SERVEROUTPUT ON SQL> DECLARE desig  VARCHAR2(20); emp_code VARCHAR2(5); empnm  VARCHAR2(20); CURSOR emp_cur(desigparam VARCHAR2) IS   SELECT empno, ename FROM employee   WHERE designation=desig; BEGIN desig:= '&desig'; OPEN emp_cur(desig); LOOP FETCH emp_cur INTO emp_code,empnm; EXIT WHEN emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(emp_code||' '||empnm); END LOOP; CLOSE emp_cur; END;
使用显式游标更新行  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],更新的语法 DELETE FROM <table_name> WHERE CURRENT OF <cursor_name> 删除的语法
使用显式游标更新行  2-2 SQL> SET SERVEROUTPUT ON SQL> DECLARE new_price NUMBER; CURSOR cur_toy IS SELECT toyprice FROM toys WHERE toyprice<100 FOR UPDATE OF toyprice; BEGIN OPEN cur_toy; LOOP FETCH cur_toy INTO new_price; EXIT WHEN cur_toy%NOTFOUND; UPDATE toys SET toyprice = 1.1*new_price WHERE CURRENT OF cur_toy; END LOOP; CLOSE cur_toy; COMMIT; END;
循环游标  2-1 ,[object Object],[object Object],[object Object],FOR <record_index> IN <cursor_name> LOOP <executable statements> END LOOP;
循环游标  2-2 SQL> SET SERVER OUTPUT ON SQL> DECLARE    CURSOR mytoy_cur IS   SELECT toyid, toyname, toyprice   FROM toys; BEGIN   FOR toy_rec IN mytoy_cur   LOOP   DBMS_OUTPUT.PUT_LINE( ‘ 玩具编号: '||' ' ||toy_rec.toyid||' '  ||‘ 玩具名称: '||' '||toy_rec.toyname||' ' ||‘ 玩具单价: '||' '||toy_rec.toyprice);   END LOOP; END;
REF  游标和游标变量  3-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
REF  游标和游标变量  3-2 ,[object Object],[object Object],TYPE my_curtype IS REF CURSOR RETURN stud_det%ROWTYPE; order_cur my_curtype;  声明强类型的  REF  游标 TYPE my_ctype IS REF CURSOR; stud_cur my_ctype; 声明弱类型的  REF  游标
REF  游标和游标变量  3-3 SQL> DECLARE    TYPE toys_curtype IS REF CURSOR RETURN toys%ROWTYPE;   toys_curvar toys_curtype;   toys_rec toys%ROWTYPE; BEGIN OPEN toys_curvar FOR   SELECT * FROM toys; FETCH toys_curvar INTO toys_rec; ... CLOSE toys_curvar; END; 声明 REF 游标类型 声明游标变量
游标变量的优点和限制 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用游标变量执行动态  SQL ,[object Object],[object Object],[object Object],[object Object],DECLARE r_emp emp%ROWTYPE; TYPE c_type IS REF CURSOR; cur c_type; p_salary NUMBER; BEGIN p_salary := 2500; OPEN cur FOR 'select * from emp where sal>:1 order by sal desc' USING p_salary; DBMS_OUTPUT.PUT_LINE(' 薪水大于 '|| p_salary ||' 的员工有: '); LOOP FETCH cur INTO r_emp; EXIT WHEN cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(' 编号: '|| r_emp.empno || '  姓名: ' || r_emp.ename|| '  薪水: ' || r_emp.sal ); END LOOP; CLOSE cur;  END;
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第七章 子程序和程序包
回顾 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
目标 ,[object Object],[object Object]
子程序  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
子程序  2-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
过程  8-1 ,[object Object],[object Object],前往售票厅 询问关于车票的信息  排队等候  在柜台购买车票
过程  8-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],创建过程,可指定运行过程需传递的参数 处理异常  包括在过程中要执行的语句
过程  8-3 CREATE OR REPLACE PROCEDURE find_emp(emp_no NUMBER) AS empname VARCHAR2(20); BEGIN SELECT ename INTO empname FROM EMP WHERE empno = emp_no; DBMS_OUTPUT.PUT_LINE(' 雇员姓名是  '|| empname); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (' 雇员编号未找到 '); END find_emp; /
过程  8-4 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
过程  8-5 ,[object Object],[object Object],SQL> CREATE OR REPLACE PROCEDURE itemdesc(item_code IN VARCHAR2) IS v_itemdesc VARCHAR2(5); BEGIN SELECT itemdesc INTO v_itemdesc FROM itemfile WHERE itemcode = item_code; DBMS_OUTPUT.PUT_LINE(item_code|| ' 项目的说明为 '||v_itemdesc); END; / SQL> SET SERVEROUTPUT ON SQL> EXECUTE itemdesc('i201');
过程  8-6 SQL> CREATE OR REPLACE PROCEDURE  test( value1 IN  VARCHAR2,  value2 OUT NUMBER ) IS identity  NUMBER; BEGIN SELECT ITEMRATE INTO identity  FROM itemFile  WHERE itemcode = value1; IF identity < 200 THEN value2:=100; END IF; END; DECLARE value1 VARCHAR2(5) := 'i202'; value2 NUMBER; BEGIN test (value1, value2); DBMS_OUTPUT.PUT_LINE('value2  的值为 ' || TO_CHAR(value2)); END; /
过程  8-7 CREATE OR REPLACE PROCEDURE swap(p1 IN OUT NUMBER, p2 IN OUT NUMBER) IS v_temp NUMBER; BEGIN v_temp := p1; p1 := p2; p2 := v_temp; END; / SQL> SET SERVEROUT ON SQL> DECLARE num1 NUMBER := 100; num2 NUMBER := 200; BEGIN swap(num1, num2); DBMS_OUTPUT.PUT_LINE('num1 = ' || num1); DBMS_OUTPUT.PUT_LINE('num2 = ' || num2); END; /
过程  8-8 ,[object Object],[object Object],SQL> GRANT EXECUTE ON find_emp TO MARTIN; SQL> GRANT EXECUTE ON swap TO PUBLIC; SQL> DROP PROCEDURE find_emp;
函数  4-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
函数  4-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
函数  4-3 ,[object Object],[object Object],CREATE OR REPLACE FUNCTION fun_hello RETURN  VARCHAR2 IS BEGIN RETURN ' 朋友,您好 '; END; / SQL> SELECT fun_hello FROM DUAL;
函数  4-4 CREATE OR REPLACE FUNCTION  item_price_range (price NUMBER)  RETURN VARCHAR2 AS min_price NUMBER; max_price NUMBER; BEGIN SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price FROM itemfile; IF price >= min_price AND price <= max_price  THEN RETURN ' 输入的单价介于最低价与最高价之间 '; ELSE RETURN ' 超出范围 '; END IF; END; / DECLARE P NUMBER := 300; MSG VARCHAR2(200); BEGIN MSG := item_price_range(300); DBMS_OUTPUT.PUT_LINE(MSG); END; /
过程和函数的比较 作为表达式的一部分调用 作为  PL/SQL  语句执行 必须在规格说明中包含  RETURN  子句 在规格说明中不包含  RETURN  子句 必须返回单个值 不返回任何值 必须包含至少一条  RETURN  语句 可以包含  RETURN  语句,但是与函数不同,它不能用于返回值 函  数 过 程
自主事务处理  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
自主事务处理  2-2 ,[object Object],[object Object],[object Object],[object Object],[object Object]
程序包 ,[object Object],[object Object],声明程序包中公共对象。包括类型、变量、常量、异常、游标规范和子程序规范等 声明程序包私有对象和实现在包规范中声明的子程序和游标 程序包 规范 主体
创建程序包  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
创建程序包  2-2 CREATE OR REPLACE PACKAGE pack_me IS PROCEDURE order_proc (orno VARCHAR2); FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2; END pack_me; / CREATE OR REPLACE PACKAGE BODY pack_me AS PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; …… END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode  VARCHAR2(5); ocode  VARCHAR2(5); BEGIN …… END order_fun; END pack_me; /
程序包的优点 ,[object Object],[object Object],[object Object],[object Object],[object Object]
程序包中的游标  2-1 ,[object Object],[object Object],[object Object],[object Object],[object Object]
程序包中的游标  2-2 SQL> CREATE OR REPLACE PACKAGE cur_pack IS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE; PROCEDURE ord_pro(vcode VARCHAR2); END cur_pack; / SQL> CREATE OR REPLACE PACKAGE BODY cur_pack AS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS  SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode);  LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne(’ 返回的值为 ' || or_rec.orderno); END LOOP; END ord_pro; END cur_pack; /
有关子程序和程序包的信息 ,[object Object],[object Object],SELECT object_name, object_type FROM USER_OBJECTS WHERE object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY'); SELECT line, text FROM USER_SOURCE WHERE NAME='TEST';
总结 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
第八章 触发器和内置程序包
回顾 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
目标 ,[object Object],[object Object]
触发器 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
创建触发器的语法 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
触发器的组成部分  3-1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
触发器的组成部分  3-2  SQL> CREATE OR REPLACE TRIGGER trig_sal AFTER UPDATE OF empsal ON salary_records … 触发器语句 为  salary_records  表创建 trig-sal  触发器 在更新  emp_sal  列之后激活触发器 触发器限制 SQL>  … FOR EACH ROW WHEN (NEW.empsal>OLD.empsal) DECLARE Sal_diff NUMBER; … 只有在 WHEN 子句中的条件得到满足时,才激活 trig_sal  触发器 触发器操作 SQL> … BEGIN   sal_diff:=:NEW.empsal-:OLD.empsal;   DBMS_OUTPUT.PUT_LINE(‘ 工资差额:’ sal_diff); END; 如果 WHEN 子句中的条件得到满足,将执行 BEGIN  块中的代码
触发器的组成部分  3-3 Oracle  数据库 更新 表 保存更新 激活 触发器 AFTER  触发器的工作原理 BEFORE  触发器的工作原理 更新 表 激活 触发器 保存更新 Oracle  数据库
创建触发器 CREATE OR REPLACE TRIGGER aiu_itemfile AFTER INSERT ON itemfile FOR EACH ROW BEGIN IF (:NEW.qty_hand = 0) THEN DBMS_OUTPUT.PUT_LINE(' 警告:已插入记录,但数量为零 '); ELSE DBMS_OUTPUT.PUT_LINE(‘ 已插入记录 '); END IF; END; /
触发器类型  6-1 ,[object Object],触发器类型 模式 (DDL) 触发器 DML 触发器 数据库级 触发器 语句级触发器 行级触发器 INSTEAD OF 触发器
触发器类型  6-2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],在模式中执行  DDL  语句时执行 在发生打开、关闭、登录和退出数据库等系统事件时执行 在对表或视图执行 DML 语句时执行 无论受影响的行数是多少,都只执行一次 对 DML 语句修改的每个行执行一次 用于用户不能直接使用  DML  语句修改的视图
触发器类型  6-3 ,[object Object],SQL> CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20)); SQL> CREATE SEQUENCE SEQ_TEST; SQL> CREATE OR REPLACE TRIGGER BI_TEST_TRG BEFORE INSERT OR UPDATE OF ID ON TEST_TRG FOR EACH ROW BEGIN IF INSERTING THEN SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL; ELSE RAISE_APPLICATION_ERROR(-20020, ' 不允许更新 ID 值! '); END IF; END; /
触发器类型  6-4 ,[object Object],SQL> CREATE OR REPLACE TRIGGER trgdemo AFTER INSERT OR UPDATE OR DELETE ON order_master BEGIN IF UPDATING THEN DBMS_OUTPUT.PUT_LINE(‘ 已更新  ORDER_MASTER  中的数据 '); ELSIF DELETING THEN DBMS_OUTPUT.PUT_LINE(‘ 已删除  ORDER_MASTER  中的数据 '); ELSIF INSERTING THEN DBMS_OUTPUT.PUT_LINE(‘ 已在  ORDER_MASTER  中插入数据 '); END IF; END; /
触发器类型  6-5 ,[object Object],SQL> CREATE OR REPLACE TRIGGER upd_ord_view INSTEAD OF UPDATE ON ord_view FOR EACH ROW BEGIN UPDATE order_master SET vencode=:NEW.vencode  WHERE orderno = :NEW.orderno; DBMS_OUTPUT.PUT_LINE(‘ 已激活触发器 '); END; /
触发器类型  6-6 ,[object Object],SQL> CREATE TABLE dropped_obj ( obj_name VARCHAR2(30), obj_type VARCHAR2(20), drop_date DATE); SQL> CREATE OR REPLACE TRIGGER log_drop_obj AFTER DROP ON SCHEMA BEGIN INSERT INTO dropped_obj VALUES( ORA_DICT_OBJ_NAME,  ORA_DICT_OBJ_TYPE, SYSDATE); END; /
[object Object],[object Object],启用、禁用和删除触发器 SQL> ALTER TRIGGER aiu_itemfile DISABLE; SQL> ALTER TRIGGER aiu_itemfile ENABLE; SQL> DROP TRIGGER aiu_itemfile;
查看有关触发器的信息 ,[object Object],SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME='EMP'; SQL> SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';
内置程序包  8-1 ,[object Object],[object Object],[object Object],[object Object],[object Object]
内置程序包  8-2 ,[object Object],用  PL/SQL  程序来读写操作系统文本文件 UTL_FILE 提供 XSLT 功能,转换 XML 文档 DBMS_XSLPROCESSOR 提供将数据转换为  XML  类型的功能 DBMS_XMLQUERY XML 解析,处理 XML 文档内容和结构 DBMS_XMLPARSER 用 DOM 模型读写 XML 类型的�
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程

Mais conteúdo relacionado

Mais procurados

4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networkingted-xu
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器Leyi (Kamus) Zhang
 
第4章 数据库管理
第4章 数据库管理第4章 数据库管理
第4章 数据库管理zhang shuren
 
MySQL5.6新功能
MySQL5.6新功能MySQL5.6新功能
MySQL5.6新功能郁萍 王
 
Basic oracle for developer&beginner
Basic oracle for developer&beginnerBasic oracle for developer&beginner
Basic oracle for developer&beginnermaclean liu
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫建興 王
 
Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍jenkin
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionFrank S.C. Tseng
 
了解真实的Oracle unbreakable database appliance
了解真实的Oracle unbreakable database appliance了解真实的Oracle unbreakable database appliance
了解真实的Oracle unbreakable database appliancemaclean liu
 
P6 数据库安装和配置
P6 数据库安装和配置P6 数据库安装和配置
P6 数据库安装和配置epst
 

Mais procurados (13)

4, OCP - oracle networking
4, OCP - oracle networking4, OCP - oracle networking
4, OCP - oracle networking
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器
 
Oracle SGA 介紹
Oracle SGA 介紹Oracle SGA 介紹
Oracle SGA 介紹
 
第4章 数据库管理
第4章 数据库管理第4章 数据库管理
第4章 数据库管理
 
MySQL5.6新功能
MySQL5.6新功能MySQL5.6新功能
MySQL5.6新功能
 
Basic oracle for developer&beginner
Basic oracle for developer&beginnerBasic oracle for developer&beginner
Basic oracle for developer&beginner
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
 
Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍Oracle数据库高级安全选件ASO介绍
Oracle数据库高级安全选件ASO介绍
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
了解真实的Oracle unbreakable database appliance
了解真实的Oracle unbreakable database appliance了解真实的Oracle unbreakable database appliance
了解真实的Oracle unbreakable database appliance
 
P6 数据库安装和配置
P6 数据库安装和配置P6 数据库安装和配置
P6 数据库安装和配置
 

Destaque

Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...
Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...
Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...Zahid02
 
诗檀软件 Oracle开发优化基础
诗檀软件 Oracle开发优化基础 诗檀软件 Oracle开发优化基础
诗檀软件 Oracle开发优化基础 maclean liu
 
Mahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sual
Mahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sualMahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sual
Mahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sualMahir M. Quluzade
 
Case Solution for Forest of Flowers
Case Solution for Forest of FlowersCase Solution for Forest of Flowers
Case Solution for Forest of Flowerscasesolutions12
 
How to create a SmallBusiness.com User page
How to create a SmallBusiness.com User pageHow to create a SmallBusiness.com User page
How to create a SmallBusiness.com User pageSmallBusiness.com
 
CQRS: An Introduction for Beginners
CQRS: An Introduction for BeginnersCQRS: An Introduction for Beginners
CQRS: An Introduction for BeginnersJonathan Oliver
 
Namasmaran And Stress Dr Shriniwas J Kashalikar
Namasmaran And Stress Dr  Shriniwas J  KashalikarNamasmaran And Stress Dr  Shriniwas J  Kashalikar
Namasmaran And Stress Dr Shriniwas J Kashalikarbanothkishan
 
Dissertation Conference Poster
Dissertation Conference PosterDissertation Conference Poster
Dissertation Conference PosterChris Hughes
 
Sponges And Cnidarians
Sponges And CnidariansSponges And Cnidarians
Sponges And CnidariansTamara
 

Destaque (16)

Oracle a TBIZ2011
Oracle a TBIZ2011Oracle a TBIZ2011
Oracle a TBIZ2011
 
Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...
Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...
Being Pro-active has improved Oracle Ebus Payslip concurrent request by 50 % ...
 
诗檀软件 Oracle开发优化基础
诗檀软件 Oracle开发优化基础 诗檀软件 Oracle开发优化基础
诗檀软件 Oracle开发优化基础
 
Mahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sual
Mahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sualMahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sual
Mahir M. Quluzade - Oracle ASM : Ən çox soruşulan 5 sual
 
Case Solution for Forest of Flowers
Case Solution for Forest of FlowersCase Solution for Forest of Flowers
Case Solution for Forest of Flowers
 
P R O B L E M Dr
P R O B L E M  DrP R O B L E M  Dr
P R O B L E M Dr
 
How to create a SmallBusiness.com User page
How to create a SmallBusiness.com User pageHow to create a SmallBusiness.com User page
How to create a SmallBusiness.com User page
 
CQRS: An Introduction for Beginners
CQRS: An Introduction for BeginnersCQRS: An Introduction for Beginners
CQRS: An Introduction for Beginners
 
Document1
Document1Document1
Document1
 
Namasmaran And Stress Dr Shriniwas J Kashalikar
Namasmaran And Stress Dr  Shriniwas J  KashalikarNamasmaran And Stress Dr  Shriniwas J  Kashalikar
Namasmaran And Stress Dr Shriniwas J Kashalikar
 
Dissertation Conference Poster
Dissertation Conference PosterDissertation Conference Poster
Dissertation Conference Poster
 
Document2
Document2Document2
Document2
 
La Opera De Paris
La Opera De ParisLa Opera De Paris
La Opera De Paris
 
Atalayas
AtalayasAtalayas
Atalayas
 
Sponges And Cnidarians
Sponges And CnidariansSponges And Cnidarians
Sponges And Cnidarians
 
phpTutorial5
phpTutorial5phpTutorial5
phpTutorial5
 

Semelhante a Oracle北大青鸟完全教程 (20)

香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
六合彩
六合彩六合彩
六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a database
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
Oracle数据库体系结构简介.ppt
Oracle数据库体系结构简介.pptOracle数据库体系结构简介.ppt
Oracle数据库体系结构简介.ppt
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
Azure Data Lake 簡介
Azure Data Lake 簡介Azure Data Lake 簡介
Azure Data Lake 簡介
 
六合彩
六合彩六合彩
六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
Oracle Compute Cloud Service介绍
Oracle Compute Cloud Service介绍Oracle Compute Cloud Service介绍
Oracle Compute Cloud Service介绍
 
Oracle 数据库一体机ODA X5-2 产品介绍.PDF
Oracle 数据库一体机ODA X5-2 产品介绍.PDFOracle 数据库一体机ODA X5-2 产品介绍.PDF
Oracle 数据库一体机ODA X5-2 产品介绍.PDF
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dba
 

Mais de yiditushe

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册yiditushe
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2yiditushe
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1yiditushe
 
性能测试技术
性能测试技术性能测试技术
性能测试技术yiditushe
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术yiditushe
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试yiditushe
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训yiditushe
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程yiditushe
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Luceneyiditushe
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍yiditushe
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Actionyiditushe
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1yiditushe
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demoyiditushe
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析yiditushe
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则yiditushe
 
10 团队开发
10  团队开发10  团队开发
10 团队开发yiditushe
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模yiditushe
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模yiditushe
 

Mais de yiditushe (20)

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1
 
性能测试技术
性能测试技术性能测试技术
性能测试技术
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Lucene
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demo
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则
 
10 团队开发
10  团队开发10  团队开发
10 团队开发
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模
 

Oracle北大青鸟完全教程

  • 2. 课程地位 .Net & C# SQL Server XML SPM ASP.NET & WebService Oracle UML SPR: Computer Base HTML&JavaScript SQL Server Base OOP&Java Base C STB JSP /Servlet EJB&WebService WinForms Struts&JSF Testing&SQA Linux
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8. Oracle 主要组件 实 例 内存结构 后台进程 PMON SMON DBWR LGWR CKPT 其他 数据库 数据文件 数据文件 数据文件 控制文件 控制文件 日志文件 日志文件 参数文件 归档日志文件 口令文件 SGA 用户进程 服务器进程 PGA 共享池 数据缓冲区 日志缓冲区
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34. 使用 Oracle 数据库的开发流程 服务器端 安装 Oracle 服务器软件 创建数据库 ( 安装时自动创建 ) 配置监听器 ( 安装时自动配置 ) 启动 Oracle 实例 ( 自动启动服务 ) 安装 Oracle 客户端软件 配置网络服务名 以新用户登录 Oracle 提交 SQL 查询 创建新用户并授权 创建用户表空间 客户端
  • 35.
  • 36.
  • 37.
  • 38.
  • 39. 第二章 SQL 查询和 SQL 函数
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 78.
  • 79.
  • 80.
  • 81. 锁的概念 2-2 修改表 修改表 拒绝访问 Price Name Toy_ID GI Joe Barbie 45 T002 20 T001
  • 82.
  • 84.
  • 85.
  • 86.
  • 87. 表级锁 3-1 修改表中的行 更新表 拒绝访问 锁定整个表,限制其他用户对表的访问。 GI Joe Barbie Name 45 T002 20 T001 Price Toy_ID
  • 88.
  • 89.
  • 90.
  • 91.
  • 92. 表分区的类型 9-1 分区方法 范围分区 散列分区 列表分区 复合分区
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111. 同义词 3-2 CREATE SYNONYM emp FOR SCOTT.emp; SCOTT.emp   的别名 模式名 表名 私有同义词 公有同义词 CREATE PUBLIC SYNONYM emp_syn FOR SCOTT.emp; 同义词名称
  • 112. 同义词 3-3 创建或替换现有的同义词 CREATE OR REPLACE SYNONYM emp_syn FOR SCOTT.emp; 替换现有的同义词 SQL> DROP SYNONYM emp; SQL> DROP PUBLIC SYNONYM emp_syn; 删除同义词
  • 113.
  • 114.
  • 115. 更改和删除序列 SQL> ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE; 使用 ALTER SEQUENCE 语句修改序列, 不能更改序列的 START WITH 参数 使用 DROP SEQUENCE 语句删除序列 SQL> DROP SEQUENCE toys_seq;
  • 116.
  • 117. 创建视图 3-1 Stud_details Stud_view 创建视图 CREATE VIEW stud_view AS SELECT studno, studname, subno FROM Stud_details; Open 5 40 Jesica 3 SC 4 33 James 2 Open 2 45 Rob 1 studcaste subno studmarks studname studno 5 Jesica 3 4 James 2 2 Rob 1 subno studname studno
  • 118.
  • 119.
  • 120. 联接视图 2-1 Stud_details Sub_details CREATE VIEW Stud_sub_view AS SELECT Studno, Studname, Submrks, Subname FROM Stud_details, Sub_Details WHERE Stud_details.Subno=Sub_details.Subno; Stud_sub_view 联接视图 4 33 James 2 4 40 Jesica 3 2 45 Rob 1 Subno Submrks Studname Studno Science 5 Maths 4 English 2 Subname Subno English 45 Rob 1 Maths 40 Jesica 3 Maths 33 James 2 Subname Submrks Studname Studno
  • 121. 联接视图 2-2 创建外联接视图 CREATE VIEW ven_ord_outj_view AS SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm, order_master om WHERE vm.vencode = om.vencode(+); SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm LEFT OUTER JOIN order_master om ON vm.vencode = om.vencode;
  • 122.
  • 123. 键保留表 Stud_details Sub_details 键保留表 因为 Studno 既是 Stud_details 中的主键, 也是联接结果中的主键 Stud_details 为什么 是键保留表? 联接视图 4 33 James 2 4 40 Jesica 3 2 45 Rob 1 Subno Submrks Studname Studno Science 5 Maths 4 English 2 Subname Subno Maths 4 40 Jesica 3 Maths 4 33 James 2 English 2 45 Rob 1 Subname Subno Submarks Studname Studno
  • 124.
  • 125.
  • 126.
  • 127. 索引 3-3 SQL> CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs; 创建标准索引 重建索引 SQL> ALTER INDEX item_index REBUILD; 删除索引 SQL> DROP INDEX item_index;
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138. 第五章 使用 PL/SQL
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147. 变量和常量 2-2 DECLARE icode VARCHAR2(6); p_catg VARCHAR2(20); p_rate NUMBER; c_rate CONSTANT NUMBER := 0.10; BEGIN ... icode := 'i205'; SELECT p_category, itemrate * c_rate INTO p_catg, p_rate FROM itemfile WHERE itemcode = icode; ... END;
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 167.
  • 168.
  • 169. 游标简介 2-1 执行 PL/SQL 程序 内存单元 保存到游标中 一次处理一行 检索行 提取行 Oracle 服务器
  • 170.
  • 171.
  • 172. 隐式游标 4-2 SQL> SET SERVEROUTPUT ON SQL> BEGIN UPDATE toys SET toyprice=270 WHERE toyid= 'P005'; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE(‘ 表已更新 '); END IF; END; / 只有在 DML 语句影响一行 或多行时,才返回 True
  • 173. 隐式游标 4-3 SQL> SET SERVEROUTPUT ON SQL> DECLARE v_TOYID TOYS.ID%type := '&TOYID'; v_TOYNAME TOYS.NAME%Type := '&TOYNAME'; BEGIN UPDATE TOYS SET NAME = v_TOYNAME WHERE toyid=v_TOYID; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE(' 编号未找到。 '); ELSE DBMS_OUTPUT.PUT_LINE(‘ 表已更新 '); END IF; END; / 如果 DML 语句不影响任何行,则返回 True
  • 174. 隐式游标 4-4 SQL> SET SERVEROUTPUT ON SQL> BEGIN UPDATE vendor_master SET venname= 'Rob Mathew' WHERE vencode='V004'; DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT); END; / 返回 DML 语句影响的行数
  • 175. SELECT INTO 语句 2-1 SQL> SET SERVEROUTPUT ON SQL> DECLARE empid VARCHAR2(10); desig VARCHAR2(10); BEGIN empid:= '&Employeeid'; SELECT designation INTO desig FROM employee WHERE empno=empid; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(' 职员未找到 '); END; / 如果没有与 SELECT INTO 语句中的条件匹配的行,将引发 NO_DATA_FOUND 异常
  • 176. SELECT INTO 语句 2-2 SQL> SET SERVEROUTPUT ON SQL> DECLARE empid VARCHAR2(10); BEGIN SELECT empno INTO empid FROM employee; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(' 该查询提取多行 '); END; / 如果 SELECT INTO 语句返回多个值, 将引发 TOO_MANY_ROWS 异常
  • 177.
  • 178. 显式游标 2-2 SQL>SET SERVER OUTPUT ON SQL>DECLARE my_toy_price toys.toyprice%TYPE; CURSOR toy_cur IS SELECT toyprice FROM toys WHERE toyprice<250; BEGIN OPEN toy_cur; LOOP FETCH toy_cur INTO my_toy_price; EXIT WHEN toy_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('TOYPRICE=: 玩具单价 = : '||my_toy_price); END LOOP; CLOSE toy_cur; END; 声明游标 打开游标 提取行 关闭游标
  • 179.
  • 180.
  • 181. 使用显式游标更新行 2-2 SQL> SET SERVEROUTPUT ON SQL> DECLARE new_price NUMBER; CURSOR cur_toy IS SELECT toyprice FROM toys WHERE toyprice<100 FOR UPDATE OF toyprice; BEGIN OPEN cur_toy; LOOP FETCH cur_toy INTO new_price; EXIT WHEN cur_toy%NOTFOUND; UPDATE toys SET toyprice = 1.1*new_price WHERE CURRENT OF cur_toy; END LOOP; CLOSE cur_toy; COMMIT; END;
  • 182.
  • 183. 循环游标 2-2 SQL> SET SERVER OUTPUT ON SQL> DECLARE CURSOR mytoy_cur IS SELECT toyid, toyname, toyprice FROM toys; BEGIN FOR toy_rec IN mytoy_cur LOOP DBMS_OUTPUT.PUT_LINE( ‘ 玩具编号: '||' ' ||toy_rec.toyid||' ' ||‘ 玩具名称: '||' '||toy_rec.toyname||' ' ||‘ 玩具单价: '||' '||toy_rec.toyprice); END LOOP; END;
  • 184.
  • 185.
  • 186. REF 游标和游标变量 3-3 SQL> DECLARE TYPE toys_curtype IS REF CURSOR RETURN toys%ROWTYPE; toys_curvar toys_curtype; toys_rec toys%ROWTYPE; BEGIN OPEN toys_curvar FOR SELECT * FROM toys; FETCH toys_curvar INTO toys_rec; ... CLOSE toys_curvar; END; 声明 REF 游标类型 声明游标变量
  • 187.
  • 188.
  • 189.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197. 过程 8-3 CREATE OR REPLACE PROCEDURE find_emp(emp_no NUMBER) AS empname VARCHAR2(20); BEGIN SELECT ename INTO empname FROM EMP WHERE empno = emp_no; DBMS_OUTPUT.PUT_LINE(' 雇员姓名是 '|| empname); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (' 雇员编号未找到 '); END find_emp; /
  • 198.
  • 199.
  • 200. 过程 8-6 SQL> CREATE OR REPLACE PROCEDURE test( value1 IN VARCHAR2, value2 OUT NUMBER ) IS identity NUMBER; BEGIN SELECT ITEMRATE INTO identity FROM itemFile WHERE itemcode = value1; IF identity < 200 THEN value2:=100; END IF; END; DECLARE value1 VARCHAR2(5) := 'i202'; value2 NUMBER; BEGIN test (value1, value2); DBMS_OUTPUT.PUT_LINE('value2 的值为 ' || TO_CHAR(value2)); END; /
  • 201. 过程 8-7 CREATE OR REPLACE PROCEDURE swap(p1 IN OUT NUMBER, p2 IN OUT NUMBER) IS v_temp NUMBER; BEGIN v_temp := p1; p1 := p2; p2 := v_temp; END; / SQL> SET SERVEROUT ON SQL> DECLARE num1 NUMBER := 100; num2 NUMBER := 200; BEGIN swap(num1, num2); DBMS_OUTPUT.PUT_LINE('num1 = ' || num1); DBMS_OUTPUT.PUT_LINE('num2 = ' || num2); END; /
  • 202.
  • 203.
  • 204.
  • 205.
  • 206. 函数 4-4 CREATE OR REPLACE FUNCTION item_price_range (price NUMBER) RETURN VARCHAR2 AS min_price NUMBER; max_price NUMBER; BEGIN SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price FROM itemfile; IF price >= min_price AND price <= max_price THEN RETURN ' 输入的单价介于最低价与最高价之间 '; ELSE RETURN ' 超出范围 '; END IF; END; / DECLARE P NUMBER := 300; MSG VARCHAR2(200); BEGIN MSG := item_price_range(300); DBMS_OUTPUT.PUT_LINE(MSG); END; /
  • 207. 过程和函数的比较 作为表达式的一部分调用 作为 PL/SQL 语句执行 必须在规格说明中包含 RETURN 子句 在规格说明中不包含 RETURN 子句 必须返回单个值 不返回任何值 必须包含至少一条 RETURN 语句 可以包含 RETURN 语句,但是与函数不同,它不能用于返回值 函 数 过 程
  • 208.
  • 209.
  • 210.
  • 211.
  • 212. 创建程序包 2-2 CREATE OR REPLACE PACKAGE pack_me IS PROCEDURE order_proc (orno VARCHAR2); FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2; END pack_me; / CREATE OR REPLACE PACKAGE BODY pack_me AS PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; …… END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode VARCHAR2(5); ocode VARCHAR2(5); BEGIN …… END order_fun; END pack_me; /
  • 213.
  • 214.
  • 215. 程序包中的游标 2-2 SQL> CREATE OR REPLACE PACKAGE cur_pack IS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE; PROCEDURE ord_pro(vcode VARCHAR2); END cur_pack; / SQL> CREATE OR REPLACE PACKAGE BODY cur_pack AS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode); LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne(’ 返回的值为 ' || or_rec.orderno); END LOOP; END ord_pro; END cur_pack; /
  • 216.
  • 217.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224. 触发器的组成部分 3-2 SQL> CREATE OR REPLACE TRIGGER trig_sal AFTER UPDATE OF empsal ON salary_records … 触发器语句 为 salary_records 表创建 trig-sal 触发器 在更新 emp_sal 列之后激活触发器 触发器限制 SQL> … FOR EACH ROW WHEN (NEW.empsal>OLD.empsal) DECLARE Sal_diff NUMBER; … 只有在 WHEN 子句中的条件得到满足时,才激活 trig_sal 触发器 触发器操作 SQL> … BEGIN sal_diff:=:NEW.empsal-:OLD.empsal; DBMS_OUTPUT.PUT_LINE(‘ 工资差额:’ sal_diff); END; 如果 WHEN 子句中的条件得到满足,将执行 BEGIN 块中的代码
  • 225. 触发器的组成部分 3-3 Oracle 数据库 更新 表 保存更新 激活 触发器 AFTER 触发器的工作原理 BEFORE 触发器的工作原理 更新 表 激活 触发器 保存更新 Oracle 数据库
  • 226. 创建触发器 CREATE OR REPLACE TRIGGER aiu_itemfile AFTER INSERT ON itemfile FOR EACH ROW BEGIN IF (:NEW.qty_hand = 0) THEN DBMS_OUTPUT.PUT_LINE(' 警告:已插入记录,但数量为零 '); ELSE DBMS_OUTPUT.PUT_LINE(‘ 已插入记录 '); END IF; END; /
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.

Notas do Editor

  1. 既提供关系数据库系统的功能, 又提供面向对象的数据库系统 功能,并且提高了数据的完整 性。