数据库(database,简称DB):用于存放数据的仓库。
数据库管理系统(Database Management System,DBMS):指数据库系统中对数据进行管理的软件系统。
数据库管理员(database administrator,DBA):是负责对数据进行规划、设计、协调、维护和管理的人员。
Oracle Database,简称Oracle。是美国ORACLE(甲骨文)公司的一款对象关系型的数据库管理系统(ORDBMS)。目前在数据库市场上占有主要份额。
- 性能优越,大型数据库中的典范
- 对象关系型的数据库管理系统(ORDBMS)
- 在数据安全性与数据完整性控制方面性能优越
- 跨操作系统,跨硬件平台的数据互操作能力
- 应用广泛,在管理信息方面,企业数据处理,因特网及电子商务等领域使用非常广泛
- 支持多用户,大事务量的事务处理
- 可移植性好
Oracle数据库:相关的操作系统文件(即存储在计算机硬盘上的文件)集合,这些文件组织在一起,成为一个逻辑整体,即为Oracle数据库。
Oracle数据库作用:数据库用来存储数据的集合,Oracle用它来存储和管理相关的信息,注意数据库必须要与内存里的实例合作,才能对外提供数据管理服务。
Oracle实例:位于物理内存里的数据结构,它由操作系统的多个后台进程和一个共享的内存池所组成,共享的内存池可以被所有进程访问。
Oracle实例 = 进程 + 进程所使用的内存[SGA(System Global Area)]
注意:
- 可以由一个或多个实例访问一个数据库,但是一个实例一次只能访问一个数据库。
- Oracle的实例就是Oracle的进程和内存,数据库就是保存数据的物理文件。
- sys:是个超级用户,用于的权限最大,可以完成数据库的所有管理任务
- system:没有sys的权限大,通常用来创建一些用于查看管理信息的表和视图,但不建议使用system架构来创建一些与管理无关的表和视图
- sysman:是Oracle数据库中用于EM管理的用户,如果你不用该用户,也可以删除。
- scott:是Oracle提供的示例用户,里面有一些供初学者学习操作的数据表(emp,dept,salgrade,bonus)
注意:sys和system在登录Oracle工具时,sys只能以系统管理员(sysdba)或系统操作员(sysoper)的权限登录,而system可以直接登录(normal)
SQLPLUS中
sysdba是管理员Oracle实例,它的存在不依赖于整个数据库完全启动了,它已经存在,以sysoper身份登录,装载数据库、打开数据库,只有数据库打开了或者说数据库完全启动后,dba角色才有了存在的基础!
sys语法使用:
system语法使用:
只进入sqlplus而不连接数据库:
启用sccot用户
给用户解锁
当用户连接数据库出现一下情况时,怎么办?
解决方案如下:
1.什么是表空间?
-
数据库与表空间
- 表空间实际上就是数据库上的逻辑存储结构,可以把表空间理解为在数据库中开辟的一个空间,用于存储我们数据的对象,一个数据库可以由多个表空间构成
-
表空间与数据文件
- 表空间实际上是由一个或多个数据文件构成,数据文件的位置和大小可以由我们用户自己定义,我们所操作的一些表,一些其他的数据对象都是存放在数据文件里的,那么数据文件是物理存储结构,真正可以看到的,而表空间是逻辑存储结构
2.表空间的分类
- 永久表空间
- 临时表空间
- UNDO表空间
3.创建表空间
a.创建用户
b.查看创建用户的方式
c.给创建的用户授权
d.管理用户
1.什么是角色?
- Oracle角色(role)就是一组权限(或者说是权限的集合)
- 用户可以给角色赋予指定的权限,然后将角色赋予给相应的用户
2.三种标准的角色
(1)connect(连接角色)
- 拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构
(2)resource(资源角色)
- 拥有Resource权限的用户只可以创建实体,不可以创建数据库结构
(3)dba(数据库管理员角色)
- 拥有全部权限,是系统最高权限,只有DBA才可以创建数据库结构
注意:对于普通用户,授予connect,resource权限;对于DBA管理用户,授予dba权限。
3.创建角色
4.为角色赋予权限
5.将角色赋予给用户
6.撤销赋予用户的权限
7.删除角色
权限的作用
- 数据库的安全性,即为系统安全性,数据安全性
权限的分类
- 系统权限:允许用户执行特定的数据库动作,如创建表、创建索引、连接实例等。
- 对象(实体)权限:允许用户操纵一些特定的对象,如读取视图、可更新某些列、执行存储过程等
系统权限
注意:
1).如果使用with grant option为某个用户授予系统权限,那么对于被这个用户授予相同权限的所有用户来说,取消该用户的系统权限并不会级联取消这些用户的相同去权限。
2).系统权限无级联,即A授权予B权限,B授权予C权限,如果A收回B的权限,C的权限不会受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。
对象权限
1.查看用户的表空间
相关的数据字典:
- dba_tablespaces:管理员级别
- user_tablespaces:普通用户
注意:普通用户无法查看系统级别的表空间
2.查看系统用户的表空间
相关的数据字典:
- dba_users:管理员用户级别
- user_users:普通用户级别
3.设置用户默认或临时表空间
4.修改与删除表空间
1.设置联机或脱机状态
特别说明:如果一个表空间设置成脱机状态,表示该表空间暂时不让访问,设置成脱机状态不是删除,当我们需要使用该表空间时还可以将其设置成联机状态,正常使用。
2.设置只读或可读写状态
特别说明:默认是可读可写状态
3.增加数据文件
说明:向创建好的表空间里增加数据文件
4.删除数据文件
说明:不能删除表空间中的第一个创建的数据文件,如果需要删除的话,我们需要把整个的表空间删掉。
5.删除表空间
说明:
若果删除掉表空间,而不删除表空间中的数据文件,则执行如下命令:
若果删除掉表空间及其表空间中的数据文件,则执行如下命令:
(1)SQL的定义
- 结构化查询语言(Structured Query Language)简称SQL
- 是一种特殊的目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统的语言
(2)SQL的分类
- DDL(Data Definition Language)—数据定义语言
- DML(Data Manipulation Language)—数据操纵语言
- DCL(Data Control Language)—数据库控制语言
- TCL(Transaction Control Language)—事务控制语言
(3)字段数据类型
操作示例:
(4)SQL创建表语法
1.创建表
语法规则:
操作示例:
2.表约束
- oracle中提供的自动保持数据库完整性的一种方法,它通过限制字段中数据、记录中数据和表之间的数据来确保数据的完整性
完整约束基础语法:
3.约束分类
- 主键约束(primary key constraint)
- 唯一性约束(unique constraint)
- 默认约束(defatut constraint)
- 非空约束(not null constraint)
- 检查约束(check constraint)
- 外键约束(foreign key constraint)
4.约束类型作用
(1).主键约束
- 用于定义基本表的主键,它是唯一确定表中每一条记录的标识符,其值不为空,也不重复,每个表中只能有一个主键,但可由多列构成。如:PRIMARY KEY(科目编号,科目名称)
操作示例:
方式一:创建表时添加主键
方式二:修改表添加主键约束
(2).非空约束
- NOT NULL 约束用于确保当前列值不能为NULL,如果在列上定义了NOT NULL约束,那么当插入数据时,必须为该列提供数据;当更新列数据时,不能将其值设置为NULL
- 非空(not null)约束是
扩展知识:列级约束与表级约束
- 列级约束
说明:列级约束必须跟在列的定义后面
- 表级约束
说明:表级约束不与列在一起,而是单独定义的
操作示例:
方式一:创建表时添加约束
方式二:修改表添加约束
删除约束的方式
- 将约束无效化或激活
- 彻底删除约束
- 删除非空约束的方式
(3).唯一性约束
- 用于指定一个或者多个列的组合值具有唯一性,以防止在列中输入重复的值
唯一性约束的注意事项:
- 使用唯一性约束的列允许为空值
- 一个表中可以允许有多个唯一性约束
- 可以把唯一性约束定义在多个列上
方式一:创建表时添加唯一性约束
方式二:修改表添加唯一性约束
删除唯一性约束
(4).检查约束
- 对输入列或者整个表的值设置检查条件以限制输入值,保证数据库的完整性
方式一:创建表时添加检查约束
方式二:修改表添加检查约束
删除唯一性约束
(5).外键约束
- 用于加强两个表数据之间的链接的一列或多列,是唯一涉及两个表关系的约束
外键约束的注意事项:
- 设置外键约束时主表的字段必须是主键列(或唯一列)
- 主表从表相应字段必须是同一数据类型
- 从表中外键字段的值必须来自主表的相应字段的值,或者为NULL值。
方式一:创建表时添加外键约束
方式二:修改表添加约束
删除外键约束的方式
(5)SQL修改和删除表
1.添加列
2.修改列
3.删除列
4.重命名列
5.修改表名
6.删除表
注意:TRUNCATE操作用于删除表中的全部数据,并不是把表删除掉,这种方式要比delete方式删除数据的速度要快,也叫截断表
(6)SQL的DML (增删改查)
1 添加信息 INSERT
2 查询信息 SELECT
3 修改信息 UPDATE
4 删除信息 DELETE
(7)oracle事务
1.什么是事务?
- 事务可以看作是由对数据库的若干操作组成的单元,这些操作要么完成,要么都取消,从而保证数据满足一致性的要求。
2.事务的组成?
- 一条或者多条DML
- 一条DDL
- 一条DCL
DML 语句需要使用COMMIT提交事务或使用ROLLBACK回滚事务
DDL和DCL是自动提交事务的
3.为什么使用事务?
- 保证数据的安全有效
当执行事务操作(DML语句)时,Oracle会在被作用表上加表锁,以防止其他用户改变结构;同时会在被作用行上加行锁,以防止其他事务在相应行上执行DM操作。
4.事务控制命令
-
提交事务(COMMIT)
- 通过COMMIT语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化、结束事务、删除保存点,释放锁
- 当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化的新数据。
-
回滚事务:(ROLLBACK)
- ROLLBACK只能对未提交的数据撤销,已经commit的数据是无法撤销的,因为comit之后已经持久化到数据库中了。
-
保存点(SAVEPOINT)
- 是事务中的一点,用于取消部分事务,当结束事务时,会自动删除该事务所定义的所保存的点。当执行ROLLBACK时,通过指定保存点可以退到指定的点。
(8).Oracle的数据字典
1.数据字典
- 说明:数据字典是ORACLE存放有关数据库信息的地方,其用途是用来描述数据的。数据库数据字典是一组表和视图结构。
- 数据字典中的表是不能直接被访问的,但是可以访问数据库字典中的视图。
2.数据字典的作用
- 作用:通过访问数据字典,可查看数据库内部的详细信息,以解决遇到的问题。
3.Oracle中常用的数据字典
常用数据字典分为三类:
应用数据字典查看相应的数据库信息
(1).基本查询
(2).排除重复行distinct
- 默认情况下,当执行查询操作时,会显示所有满足条件的行,包括重复行。
(3).查询日期列
- 日期列:指数据类型为日期类型的列,如DATE类型
- 日期列的默认格式为DD-MON-RR(RR:代表年,而且只取年份的后两位数字)
日期格式中RR与YY的区别
注意:RR中,指定日期中的年份和当前年份在049之间,表示结果年份和YY结果年份相同;指定日期中的年份在5099之间和当前年份在049之间,表示结果年份比YY结果早一个世纪;指定日期中的年份在049之间和当前年份在50~99之间,表示结果年份比YY结果晚一个世纪。
设置不同语言显示日期结果
(3).算术运算符
算术运算符可应用在数字和日期列上
算术运算符的优先级:
- 乘除具有相同的优先级,加减具有相同的优先级,相同优先级的运算符从左向右执行
- 乘除的优先级大于加减,但有括号,不管括号外优先级多高,优先运算括号内
(4).算数运算中的空值NULL
NULL:表示未知值,它既不是空格也不是0。
(1).当算数表达式包含NULL时,其显示结果也为空(NULL)
扩展知识:空值与默认值
空值:当插入数据时,如果没有为特定列提供数据,并且该列没有默认值,那么其结果为NULL。
默认值:在创建表时可以使用default关键字为列设置默认值,在表中插入数据时,如果没有为该列提供数据,那么该列将使用默认值。
Oracle字符集知识
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台
(5) .查询语句中的别名和连接符的应用
1.列的别名
- 用于改变列的显示标题,列的别名可以跟在列名的后面,也可以在二者之间间加AS关键字
注意:如果别名中包含空格或特殊的字符或者需要区分大小写,那么需要给别名加上双引号
2.连接符||
当执行查询结果操作时,为了显示更有意义的结果值,有时需要将多个字符串连接起来,连接字符串可以使用"||"操作符或者concat函数,把列与列,列与字符连接在一起,用“||”表示,可以用来合并列。
3.字符串
- 字符串可以是select列表中的字符,数字,日期
- 日期和字符只能在单引号中出现
- 每当返回一行,字符串被输出一次
(6).过滤数据(Where 比较运算符)
- 使用WHERe 子句,将不满足条件的行过滤掉
比较运算符
(7). 过滤数据(范围、模糊查询等空值)
1.BETWEEN…AND
- 用于指定特定范围的条件,包含边界值
2.IN
- 执行列表匹配的操作,列或表达试结果匹配列表中的任意一个值
3.LIKE
- 用于执行模糊查询,当执行模糊查询时,需要使用通配符%和_
通配符知识:
4判断空值 IS NULL
(8).过滤数据(逻辑运算)
- 逻辑操作符 AND
- 逻辑操作符 OR
- 逻辑操作符 NOT
逻辑操作符的优先级
NOT优先级最高,AND其次,OR优先级最低,如果需要改变优先级,需要使用括号。
(9).排序数据ORDER BY
(10)SQL语句与SQLPLUS命令
SQL:
- 一种语言,是关系数据库的基本操作语言,它是应用程序与数据库进行交互操作的接口,从而使得应用开发人员、数据库管理员、最终用户都可以通过SQL语言对数据库进行操作。
- SQL语句不区分大小写,但关键字不能缩写
- SQL语句必须用";"结束
- alter user 用户名 identified by 新密码;
SQLPLUS:
- 一种环境,是Oracle公司所提供的工具程序,是与oracle数据库进行交互的客户端工具,借助sqlplus工具可以查看、修改数据库记录,在sqlplus中,可以运行SQL语句。
- SQLPLUS命令不区分大小写,但关键字能缩写,例如:connect->conn
- SQLPLUS命令可以不用";"
- ,username用于指定用户名,注意:任何用户都可使用该命令修改其他自身口令,但如果要修改其他用户口令,则必须以DBA的身份登入(sys/system)
(1).SQL函数的定义
- SQL函数是Oracle数据库内置函数,并且可用于各种SQL语句
- SQL函数包括单行函数和多行函数
(2).单行函数分类
1.字符函数
- 字符函数的输入参数为字符类型,其返回值是字符类型或数字类型
操作示例:
2.数值函数
- 数值函数的输入参数和返回值都是数字类型
3.日期函数
- 用于处理日期时间类型的函数
4.转换函数
- 用于将数据从一种数据类型转换成另一种数据类型
Oracle可以隐式的(自动的)进行数据类型转换
转换格式:
TO_CHAR
- 将日期类型转换为字符类型
- 将数值类型转换为字符类型
TO_DATE
- 用于将字符串转换成日期类型的数据
TO_NUMBER
- 将包含数字的字符串转换成数值类型
5.通用函数
- 此函数适用于任何数据类型,同时也适用于空值
NVL
- 用于处理NULL
NVL2
- 用于处理NULL
NULLIF
- 用于比较两个表达式
COALESCE
- 用于返回表达式列表中第一个not null表达式的结果
(3).行列转换函数
case函数
DECODE函数
WM_CONCAT函数
- wm_cnocat行转列(让查询结果行转列),把列值以","号分隔开,并显示一行
(4).分组函数
1.分组函数定义
- 在关系数库中,使用数据分组可以取得表数据的汇总信息,数据分组是通过分组函数、group by以及having等字句共同实现
分组函数的语法:
常用的分组函数:
2.聚合函数的特点:
- 聚合函数忽略null值
- 可以和distinct搭配使用
- 和聚合函数一同查询的字段要求是group by后的字段
3.count函数的特点
COUNT(*)和COUNT(1):使用的时候,不会自动过滤null值(简单理解,COUNT(星)是统计行记录,只要这行记录至少有一个字段不为空,就可以+1;COUNT(1)是相当于在表前面加了一列,字段内容为1,然后统计 1 的个数,来统计行数)
COUNT(字段名):使用的时候自动过滤null值
(5).集合运算符
- 集合操作符专门用于合并多条select语句的结果
union:操作符用于取得两个结果集的并集,当使用该操作符是,会自动去掉结果集中的重复行,并且会以第一列的字段进行升序排序
union all :操作符用于取得两个结果集的并集,但与union操作符不同,该操作符不会取消重复行,并且不会对结果集数据进行排序
intersect:操作符用于取得两个结果集的交集,当使用操作符时,只会显示同时存在于两个结果集中的数据,并且会以第一列的字段进行升序排序。
minus :操作符用于取得两个结果集的差集,当使用该操作符时,只会显示在第一个结果集中存在,在第二个结果集中不存在的数据,并且会以第一列的结果集进行升序排序。
(1).子查询的概述
- 子查询是指嵌入在其他SQL语句 SELECT中的语句,也称为嵌套查询。
示例:
(2).为什么使用子查询?
(3).子查询的语法
a.在 select子句中使用子查询
b.在having子句中的子查询
c.在from子句中的子查询
(4).子查询和主查询
什么是主查询和子查询?
一个主查询可以有多个子查询
(5).子查询的执行顺序
一般先执行子查询,再执行主查询,但相关子查询例外
主查询和子查询可以不是同一张表
(6).单行子查询
只返回一行数据的子查询语句·使用单行比较操作符
示例:
(7).多行子查询
- 多行子查询是指返回多行数据的子查询语句。使用多行比较操作符。
-
in
在多行子查询中使用IN操作符
-
not in
在多行子查询中使用not 操作符
-
all
在多行子查询中使用ALL操作符
any
在多行子查询中使用ALL操作符
(8).子查询需要注意的问题
1.不可以在 group by子句中使用子查询
在TOP-N分析问题中,须对子查询排序
单行子查询和多行子查询中的空值问题
单行子查询:如果子查询返回了一个空值,则主查询将不会查到任何结果。
多行子查询:
(1)什么是PL/SQL?
- PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL),简而言之,PL/SQL是面向过程的语言
- PL/SQL是oracle数据库对SQL语句的扩展,在普通SQL语句的使用上增加了编程语言的特点,简而言之,PL/SQL是对SQL语言的扩展
(2)PL/SQL的特点
- PL/SQL是Oracle系统的核心语言,现在Oracle的许多部件都是由PL/SQL写成的,PL/SQL具有简单、高效、灵活、实用的特点。
(3)不同数据库对SQL的扩展
- Oracle:PL/SQL
- SQL Server:Transac-SQL(T-SQL)
(4)PL/SQL语法结构
1).PL/SQL块
- 块(black): 是PL/SQL的基本程序单元
- PL/SQL由三部分构成:
- 声明部分、执行部分、异常处理部分
2).PL/SQL的基本结构
3).第一个PL/SQL程序
打印一句hello world!
注意:当Command Window窗口使用中DBMS_OUTPUT包输出信息时,需要设置SQL PLUS环境serveroutput的值为ON
4).PL/SQL块的分类
- 匿名块:动态构造、只执行一次
- 子程序:存储在数据库中的存储过程、函数及包中等。当在数据库上建立好之后可以在其它程序中调用他们
- 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序
5).PL/SQL的变量
1.标识符
- 当编写PL/SQL块时,为了临时存储数据,需要定义变量和常量。变量和常量的定义是需要满足标识符的限制要求如下:
- 标识符不能超过30个字符
- 第一个字符必须为字母
- 不分大小写
- 不能用‘-’(减号)
注意:尽量不要变量名声明和表字段名一样
2.变量名的命名方法
为提高代码的可读性,建议使用命令方法。
3.变量的类型
- 数值类型:NUMBER(P,S)以及子类型INT、FLOAT等
- 字符类型:CHAr(n)、VARCHAr2(n)
- 日期类型:DATE
- 布尔类型:BOOLEAN(true.false.null)
4.变量的大小写规则
- 当编写sql语句和PL/SQL语句时,既可以采用大写格式,也可以采用小写格式,但是为了代码的可读性,应尽量按照以下的规则:
- SQL关键字采用大写格式,如: SELECT ,UPDATE等
- PL/SQL关键字采用大写格式,如; DECLARE,BEGIN,EDN等
- 数据类型采用大写格式,如: INT、DATE等
- 标识符和参数采用小写格式,如: v_sal等
- 数据库对象和采用小写格式,如: emp,sal等
代码示例:
5.注释
- 单行注释:
- 多行注释:
6).PL/SQL引用型变量和记录型变量
- 在很多情况下,PL/SQL变量可以用来存储在数据库表中的数据,在这种情况下,变量应该拥有与表列相同的类型
代码示例:
引用型变量
- 引用类型变量的数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型形同
记录型变量
- PL/SQL提供%ROWTYPE操作符,返回一个记录类型,其数据类型和数据库表中的数据结构相一致。
(5).PL/SQL的运算符
a.算术运算符
代码示例:
b.关系运算符
代码示例:
c.比较运算符
代码示例:
d.逻辑运算符
(6).变量赋值
- 在PL/SQL编程中,变量赋值是一个值得注意的地方。
字符及数字运算特点:
- NULL加数字仍是空值:NULL+数字=NULL
- NULL加(连接)字符,结果为字符:NULL||字符串=字符串
(5)PL/SQL流程控制
1).PL/SQL流程控制分类:
- 条件控制语句(条件分支语句):if语句和CASE语句
- 循环语句:LOOP语句
- 顺序语句:GOTO语句、NULL语句
2).条件控制语句
- 条件控制语句:用于依据特定情况选择要执行的操作
if语句
a.简单条件判断if-else
b.二重条件分支
c.多重条件判断
CASE语句
- 使用CASE语句执行多重分支操作,语句更加简洁,执行效率更好
使用CASE语句处理多重条件分支由两种方法
第一种:使用单一选择符进行等值比较
第二种:使用多种条件进行非等值比较
3).循环语句
a.基本循环LOOP
b.while循环
c.for循环
4).PL/SQL的嵌套循环
- 嵌套循环是指在一个循环语句中嵌入另一个循环语句
- 标号用于标记嵌套块或嵌套循环
- 使用<<label_name>>定义标号
5).退出语句
EXIT:用于直接退出当前循环
EXIT WHEN:用于满足特定条件的情况下退出当前循环
CONTINUE:用于直接结束当前循环并继续下一组循环
ConTINUE WHEN:用于在满足特定条件时结束当前循环语句并继续下一组循环语句
6).PL/SQL的顺序语句
1.GOTO语句
- GOTO语句用于跳转到特定标号处执行语句
注意:当使用GOTO跳转到特定标号时,标号后至少要包含一条执行语句
2.NULL语句
- NULL语句不会执行任何操作,并且会直接将控制传递到下一个语句,使用该语句的主要目的是提高PL/SQL块的可读性
7)动态sql
- 动态SQL是指在PL/SQL编译时SQL语句是不确定的,如根据用户输入的参数的不同来执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态创建语句,对语句进行分析,并执行该语句
动态创建SQL有以下几类:
1、DDL语句、DCL语句、非查询的DML语句、单行查询的SELECT语句,这类可以使用EXECUTE IMMEDIATE语句执行。
2、多行查询的SELECT语句可以使用游标来实现。
3、通过DBMS_SQL程序包实现。
使用EXECUTE IMMEDIATE语句结构:
1.动态创建表t1
2.动态插入数据
3.查询表中的数据有多少行
知识链接:https://www.cnblogs.com/zhengcheng/p/4207376.html
(1)什么是游
- 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。
(2)游标的类型
- 显式游标
- 隐式游标
a.显式游标
显式游标处理的四个步骤:
- 定义游标:
- 打开游标:
- 提取数据:
- 关闭游标:
操作示例:
显式游标的属性
%FOUND
- 用于检测游标结果集是否存在数据,如果存在数据,返回TRUE
%NOTFOUND
- 用于检测游标结果集是否不存在数据,如果不存在数据,返回TRUE
%ISOPEN
- 用于检测游标是否已经打开,如果已经打开返回TRUE
%ROWCOUNT
- 用于返回已提取的实际行数
b.游标FOR循环
- 当使用游标FOR循环时,Oracle会隐含的打开游标,提取数据并关闭游标
c.参数游标
- 参数游标是指带有参数的游标,通过使用参数游标,使用不同参数值可以生成不同的游标结果集
d.隐式游标
显式游标是用户自定义的显式创建的游标,主要是用于对查询语句的处理
隐式游标是由系统隐含创建的游标,主要用于对非查询语句,如修改,删除等操作。则有Oracle系统自动地为这些操作设置游标并创建其工作区,对于隐式游标地操作,如定义、打开、取值及关闭操作,都有Oracle系统自动完成,无需用户进行处理,名字为SQL,这是由Oracle系统定义的。
当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程
注意:通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性
隐式游标的属性:
- SQL%FOUND
- SQL%NOTFOUND
- SQL%ISOPEN
- SQL%ROWCOUNT
(3).使用游标修改或删除数据注意点
- 如果创建的游标需要执行更新或删除的操作必须带有FOR UPDATE子句
FOR UPDATE子句会将游标提取出来的数据进行行级锁定,这样在会话更新期间,其他用户的会话就不能对当前游标中的数据行进行更新操作。
NOWALT
- 用于指定不等待锁,如果发现所操作的数据行已经锁定,将不会等待,立即返回
OF column_reference
- 当游标子查询涉及到多张表时,那么默认情况下会在所有表上加行共享锁,为了只在特定表上加行共享锁,需要在for update子句后带有of子句,of后面跟字段名,如果跟表名或游标名称,则会报错:标示符无效。示例如下:
(1).什么是异常?
- 异常是程序在正常执行过程中发生的未预料的事件
上述代码有一个很大的问题,如果查找的员工不存在呢,程序会报错,如何解决?
(2).什么是异常处理?
- 异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现地各种错误,使程序正常运行
(3).异常处理机制
操作示例:解决上述报的异常问题
(4).异常处理地分类
- 预定义异常
- 非预定义异常
- 自定义异常
a.预定义异常
- 预定义异常是指由PL/SQL所提供地系统异常,Oracle提供了20多个预定义异常,每个预定义异常对应一个特定地Oracle错误,当PL/SQL块出现这些Oracle错误时,会隐含地触发相应地预定义异常
- 对于预定义异常情况的处理,无需在程序中定义,只需要PL/SQL块的异常部分处理,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
b.非预定义异常
- 用于处理预定义异常所不能处理的ORACLE错误,此种异常需要在程序中定义
非预定义异常的处理包括3步:
1.在PL/SQL块定义部分定义异常情况:
2.将其定义好的异常情况与标准的ORACLE错误联系起来,使用PRAGMA EXCEPTION_INIT语句:
3.在PL/SQL块的异常情况处理部分对异常情况做出相应的处理
c.用户自定义异常
如果你想在某个特定事件发生时向应用程序的用户发出一些警告信息,而事件本身不会抛出Oracle内部异常,这个异常是属于应用程序的特定异常,那么就需要自定义异常。用户自定义的异常错误是是通过显式使用RALSE语句来触发,当引发一个异常错误时,控制就转向到EXCEPTION块异常错误部分,执行错误处理代码。
自定义异常的处理步骤:
1.在PL/SQL块的声明部分定义异常情况:
2.使用RALSE触发
3.在PL/SQL块的异常情况处理部分对异常情况做出相应的处理
(5).异常处理函数SQLCODE和SQLERRM
- 异常处理函数用于取得Oracle错误号和错误信息,其中函数SQLCODE是取得错误号,SQLERRM用于取得错误信息,当编写PL/SQL快时,通过在异常处理部分引用函数SQLCODE和SQLERRM,可以取得未预计到的Oracle错误。
- 通过内置过程RAISE_APPLICATION_ERROR.可以在建立子程序(过程、函数、包)时自定义错误号和错误信息。
(6).RAISE_APPLICATION_ERROR
- 该过程用于在PL/SQL子程序中自定义错误信息,测试异常处理,将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或其他前台开发语言)
操作示例:
(1).什么是存储过程和存储函数
相同点:
- 存储在数据库中的被命名的PL/SQL块,供所有用户程序调用
不同点:
- 存储过程没有返回值,存储函数有返回值
(2).第一个存储过程与函数的程序
需求:用存储过程或存储函数实现输出"Hello Everyone!"
(3).创建存储过程的语法
1.创建一个带有in参数的存储过程
2.创建一个带有out参数的存储过程
3.创建一个in out的参数存储过程
(4).存储函数的创建
1.创建一个带有in参数的存储函数
2.创建一个带有out参数的存储函数
3.创建一个in out的参数存储函数
(5).调用存储过程
方法一:Oracle使用EXECUTE语句来实现对存储过程的调用:
方法二:在PL/SQL代码中直接调用
(6).删除存储过程和存储函数
注意点:
(1)什么是包?
- 包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合
(2)包的特点
- 具有面向对象程序设计语言的特点,是对PL/SQL程序设计元素(过程、函数变量等)的封装
- 它使程序设计模块化
(3).包中的程序元素
- 公用元素(公用组件)
- 私用元素(私有组件)
(4).包的组成
一个包由两个分开的部分组成:
- 包规范(包定义):用于定义包的公用组件,包括常量、变量、游标、过程和函数等
- 包主体:不仅用于实现包规范所定义的公用过程和函数,而且还可以定义包的私有组件(常量、变量、游标、过程和函数等)
(5).包的语法结构
操作示例:
(6).子程序重载
- 所谓重载是指两个或多个子程序有相同的名称,但拥有不同的参数变量、参数顺序或参数数据类型
(1).什么时序列?
- 序列(sequence):是一种用于自动生成唯一数字的数据库对象。主要用于提供主键值
(2).怎么样创建序列及使用?
注意事项:指定cache值,可以提高访问效率,但序列在如下情况会出现序列缺口
- 回滚
- 系统异常
- 多个表同时使用同一序列
操作示例:
(1).什么是同义词
- 同义词是数据库方案对象的一个别名
- 方案对象:表、索引、视图、触发器、序列、同义词、存储过程等
- 非方案对象:表空间、用户、角色等
(2).同义词的作用
- 简化对象访问
- 提供对象访问的安全性,多用户协同开发中,可以屏蔽对象名字及其持有者
(3).同义词的分类
- 公共同义词:指数据库中所有的用户都可以使用
- 私有同义词:只能被创建它的用户所拥有,其他用户在引用时必须带有方案名
(4).同义词使用
注意:schema指方案名
(1).什么是索引?
- 索引是为了加速对表中数据行的检索而创建的一种存储结构
(2).索引的分类
按索引列的个数:
- 单列索引
- 复合索引
按索引列值的唯一性:
- 唯一索引
- 非唯一索引
(3).索引的创建和使用及删除
(4).索引的创建场景
适合创建索引:
- WHERe子句经常引用的表列上
- 为了提高多表连接的性能,应该在连接列上建立索引
- 排序的列上创建索引,可以加快数据排序的速度
不适合创建索引:
- 表很小
- 列不经常作为连接条件或出现在WHERe子句中
- 表经常更新
(1).什么是视图?
- 视图是一个虚拟表,建立在已有表的基础上,以建立视图的表成为基表,向视图提供数据内容的语句为select语句
(2).为什么要使用视图?
- 安全原因,限制数据访问
- 视图可使复杂的查询易于理解和使用
(3).视图的分类
- 简单视图
- 复杂视图
- 连接视图
- 只读视图
(4).视图的创建和使用及删除
(1)什么是触发器?
- 触发器是指存放在数据库中,并且被隐含执行的存储过程
- 当发生特定事件时,Oracle会自动执行触发器的相应代码
(2).触发器的类型
- DML触发器
- DDL触发器
- 替代(instead of)触发器
- 系统触发器
(3).触发器的组成
触发事件:即在何种情况下触发TRIGGER
触发时间:即该TRIGGER是在触发事件之前(BEFORE)还是之后(AFTER)触发
触发器本身:即该TRIGGER被触发之后的目的和意图,正是触发器本身要做的事情
触发频率:说明触发器内定义的工作被执行的次数
(4).创建第一个触发器
(5).DDL触发器
1).什么是DDL触发器?
- 当创建、修改或者删除数据库对象时,也会引起相应的触发器操作事件,而此时就可以利用触发器来对这些数据库对象的DDL操作进行监控
2).创建DDL触发器语法格式
案例分析:
(6).DML触发器
1).什么是DML触发器
- DML触发器是指基于DML操作所建立的触发器
2).DML触发器的作用
- DML触发器可用于实现数据安全保护、数据审计、数据完整性、参照完整性、数据复制等功能
3).DML触发器类型
-
语句触发器
- 在指定的操作语句之前或之后执行一次,不管这条语句影响了多少行
-
行触发器
- 触发语句作用的每一条记录都被触发,在行级触发器中使用 :old和:new伪记录变量,识别值的状态
- :old 表示操作该行之前,这一行的值
- :new 表示操作该行之后,这一行的值
- 触发语句作用的每一条记录都被触发,在行级触发器中使用 :old和:new伪记录变量,识别值的状态
4).创建DML触发器语法格式
5).DML触发器的四个开发示例
(7).INSTEAD OF触发器
1).什么是替代触发器?
- 替代触发器,适用于复杂视图上的一种触发器
2).替代触发器的使用限制
- 替代触发器只适用于视图
- 替代触发器不能指定BEFORE和AFGER选项
- 不能在具有WITH CHECK OPTION选项的视图上建立替代触发器
- 替代触发器必须包含FOR EACH ROW选项
3).创建替代触发器
(8).系统触发器
- 系统触发器是由特定系统事件所触发的触发器
- 系统事件是指与方案相关的数据库事件,它包括startup、shutdown、db_role_change和servererror的四种事件
- startup事件触发器在启动数据库后触发
- shutdown事件触发器在关闭数据库之前触发
- db_role_change事件触发器在改变角色后第一次打开数据库时触发
- servererror事件触发器在发生Oralce错误时触发
1).数据库的备份的重要性
- 由于计算机系统的各种软硬件故障,用户的错误操作以及一些恶意破环时不可避免的,因此这就影响到数据的正确性,甚至造成数据损失,服务器崩溃的严重后果,备份可以有效的防止数据丢失,能够把数据库从错误状态恢复到正确状态,恢复是将原来备份的数据信息还原到数据库中
2).数据库备份方案
oracle备份:
-
物理备份
- 冷备份(脱机备份):在关闭数据库后进行的完整备份,包括参数文件、所有控制文件、所有数据文件、所有联机重做日志文件,是最快和最安全的方法。
- 热备份(联机备份)
- 用户管理备份
- Oracle管理备份
-
逻辑备份(导入导出)