行共享锁(RowShare,RS)对数据表定义了行共享锁后,如果被事务A获得,那么其他事务可以进行并发查询、插入、删除及加锁,但不能以排他方式存取该数据表。为Student表添加行共享锁行排他锁(RowExclusive,RX)当事务A获得行排他锁后,其他事务可以对同一数据表中的其他数据行进行并发查询、插入、修改、删除及加锁,但不能使用行共享锁、行共享排他锁和行排他锁3种方式加锁。为Student表添加行排他锁共享锁(Share,S)当事务A获得共享锁后,其他事务可以对同一数据表中的其他数据行进行并发查询、加共享锁但不能修改表,不能使用排他锁、行共享排他锁和行排他锁3种方式加锁。为Studen
锁概述加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。Oracle通过使用锁(Lock)机制维护数据的完整性、并发性和一致性。Oracle在两个不同级别上提供读取一致性:语句级读取一致性和事务级读取一致性。语句级读取一致性:Oracle总是实施语句级读取一致性,保证单个查询所返回的数据与该查询开始时保持一致。事务级读取一致性:事务级读取一致性是指在同一个事物中的所有数据对时间点是一致的。锁的分类在数据库中有两种基本的锁类型:排他锁(Ex
事务事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元。概述事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内部的语句都会被看成一个单元,一旦有一个失败,那么所有的都会失败。在编程过程中也经常用到事务。事务是一组数据库操作的逻辑工作单元,每个事物都是一个原子单位。在一个事务中可以包含一条或多条DML(数据操纵语言)、DDL(数据定义语言)和DCL(数据控制语言)语句,这些语句组成一个逻辑整体。在事务中包含的数据库操作是不可分割的整体,要么在一起被执行,要么回滚到执行事务之前的状态。对事务的操作有两个:提交(COMMIT)和回滚(ROLLBACK)。提交事务时,对数据库所做
查看触发器触发器是一种特殊的存储过程,从被创建之日起,触发器就被存储在数据库中,直到被删除。触发器与一般存储过程或者存储函数的区别在于触发器可以自动执行,而一般的存储过程或者存储函数需要调用才能执行。Oracle提供检索与触发器相关信息的数据字典。与触发器相关的数据字典主要包括以下几种:USER_TRIGGERS:存储当前用户所拥有的触发器。DBA_TRIGGERS:存储管理员所拥有的触发器。ALL_TRIGGERS:存储所有的触发器。USER_OBJECTS:存储当前用户所拥有的对象,包括触发器。DBA_OBJECTS:存储管理员所拥有的对象,包括触发器。ALL_OBJECTS:存储数据库中
系统事件触发器系统事件触发器是指由数据库系统事件触发的数据库触发器。数据库系统事件通常包括以下几种:数据库的启动(STARTUP)数据库的关闭(SHUTDOWN)数据库服务器出错(SERVERERROR)创建一个系统事件触发器,数据库启动后记录启动时间创建系统时间触发器测试表:createtableDB_Log(op_datetimestamp);创建系统事件触发器:createorreplacetriggertr_db_sstartupafterstartupondatabasebegininsertintoDB_Logvalues(sysdate);endtr_db_startup;在创建
INSTEADOF触发器INSTEADOF触发器主要用来对另一个表或视图进行DML操作。与DML触发器不同,在定义替代触发器后,用户对表的DML操作将不再被执行,而是执行触发器主体中的操作。使用替代触发器的一个常用情况是对视图的操作,如果一个试图由多个基表连接而成,则该视图不允许进行INSERT、UPDATE和DELETE这样的DML操作。当在视图上编写替代触发器后,用户对视图的DML操作就不会执行,而是执行触发器中的PL/SQL语句块,这样就可以通过在替代触发器中编写适当的代码,完成对组成视图的各个表进行操作。使用触发器对基于多个表建立的视图进行更新创建一个视图,显示学生信息,课程信息和选课
语句级触发器创建语句级触发器,当添加学生时弹出“用户注册窗口”。createorreplacetriggertr_studentbeforeinsertonstudentbegindbms_output.put_line('欢迎新同学!');end;执行:利用触发器实现日志管理功能。该触发器用来实现当在Student表中删除一条数据时,在stu_log表中添加一条包含当前操作用户(USER)和当前操作日期(SYSDATE)的记录创建日志表:createtablestu_log(WHOvarchar2(20),WHENDATE);创建触发器:createorreplacetriggertr_st
触发器概述触发器是一种在发生数据库事件时能够自动运行的PL/SQL代码块,它与特定表或视图上的操作相关联。触发器是大型关系数据库系统都提供的一项技术。触发器通常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计功能。触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中数据的操作时,将自动触发器中定义的操作,以实现数据的一致性和完整性。触发器的作用触发器拥有比数据库本身标准的功能更精确和更复杂的数据控制能力。在安全方面,触发器可以基于数据库的值使用户具有操作数据库的某种权利。在审
函数函数一般用于计算和返回一个值,可以将经常需要进行的计算写成函数。函数的调用是表达式的一部分,而过程的调用是一条PL/SQL语句。函数与过程在创建形式上有些相似,也是编译后放在内存中供用户使用,只不过调用时函数要用表达式,而不像过程只需调用过程名。另外,函数必须有一个返回值,而过程则没有。创建函数创建函数的语法和创建存储过程的语法也很相似。它们在数据库内采用相同的规则,参数的传递也相同。创建函数的基本语法如下:CREATE[ORREPLACE]FUNCTIONfunction_name[parameter1[IN|OUT|INOUT]data_type1,parameter2[IN|OUT|
带参数的存储过程存储过程允许带有参数,参数的使用将增加存储过程的灵活性,给数据库编程带来极大的方便。存储过程中如果使用了参数,在执行存储过程时必须为其指定参数。总的来说,参数可以是常量、变量和表达式等。Oracle有三种参数模式:INOUTINOUTIN参数该类参数值由调用者传入,并且只能够被存储过程读取。这种模式的参数是最常用的,也是默认的参数模式。示例:创建一个带有输入参数的存储过程,当使用Insert_student添加学生信息时,用户只需要向该存储过程传入参数值,然后由存储过程从中读取数据。createorreplaceprocedureInsert_student(SNOINvarc
存储过程存储过程是Oracle开发者在数据转换或查询报表时经常使用的方式一。存储过程是一种命名PL/SQL程序块,它将一些相关的SQL语句、流程控制语句组合在一起,用于执行某些特定的操作或者任务,可以将经常需要执行的特定的操作写成过程。通过过程名,就可以多次调用过程,从而实现程序的模块化设计。这种方式极大地节省了用户的时间,也提高了程序的效率。概述在Oracle中,可以在数据库中定义子程序,在子程序中将一些固定的操作集中起来,由Oracle数据库服务器完成,以完成某个特定的功能。这种子程序称为存储过程(Procc-Dure)。存储过程可以通俗地理解为是存储在数据库服务器中的封装了一段或多段SQ
同义词同义词(synonym)是表、索引和视图等模式对象的一个别名。同义词只是数据库对象的替代名,与视图类似,同义词并不占用实际存储空间,只在数据字典中保存同义词的定义。在使用同义词时,Oracle简单地将它翻译成对应方案的名称。通过使用同义词,一方面可以简化对象访问,如数据字典视图USER_INDEXES的同义词为IND,数据字典视图USER_SEQUENCES的同义词为SEQ;另一方面可以提高对象访问的安全性,如屏蔽对象所有者、对象名和数据库链接名。在开发数据库应用程序时,应当尽量避免直接引用表、视图或其他数据库对象打的名称,而改用这些对象的同义词。这样可以避免当管理员对数据库对象做出修改
序列序列(sequence)是一种数据库对象,可以为表中的行自动生成序列号,利用它可生成唯一的整数,产生一组等间隔的数值(类型为数字Number),主要用于生成唯一、连续的序号。序列是一种共享式的对象,多个用户可以共同使用序列中的序号。一般序列所生成的整数通常可以用来填充数字类型的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键的列值不会重复。用这种方法可以替代在应用程序中产生主键值的方法,可以获得更可靠的主键值。创建序列一个序列的是由特殊的Oracle程序自动生成的,因此避免了在应用层实现序列而引起的性能瓶颈。序列号是一个Oracle整数,最多可以有38个数字。创建序
触发器数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。触发器的类型语句级触发器在指定的操作语句操作之间或之后执行一次,不管这条语句影响了多少行。行级触发器(FOREACHROW)触发语句作用的每一条记录都被触发。在行级触发器中使用:old\color{red}{:old}:old和:new\color{red}{:new}:new伪记录变量,识别值的状态。语法:create[orreplace]trigger触发器名{before|after}{del
1.创建工程并导入Oracle的驱动jar包创建一个JDBCUtils工具类packagepers.zhang.utils;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassJDBCUtils{privatestaticStringdriver="oracle.jdbc.OracleDriver";privatestaticStringur
存储过程存储过程(StoredProcedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。存储过程语法:create[orreplace]PROCEDURE过程名[(参数名in/out数据类型)]ASbeginPLSQL子程序体;end;或者create[orreplace]PROCEDURE过程名[(in/out数据类型)]isbeginPLSQL子程序体:end过程名;示例:打印hellowo
例外例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。系统定义例外No_data_found:没有找到数据Too_many_rows:select…into语句匹配多个行Zero_Divide:被零除Value_error:算数或转换错误Timeout_on_resource:在等待资源时发生超时示例:被0除declarepnumnumber;beginpnum:=1/0;exceptionwhenzero_dividethendbms_output.put_line('1:0不能做分母');dbms_output.put_line('2:0不能做分母');whenotherst
数据库Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。实例一个Oracle实例(OracleInstance)由一系列的后台进程(BackguoundProcesses)和内存结构(MemoryStructures)组成。一个数据库可以有n个实例。数据文件(dbf)数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文
sql简介结构化查询语言(StructuredQueryLanguage)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统:同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存取方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以实用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言可以嵌套,这使得它具有极大的灵活性和强大的功能。DML(数据库操作语言):其语句包括动词INSERT,UPDATE和DELETE。它们分别
使用where语句对结果进行过滤SELECT*|{[DISTINCT]column|expression[alias],...}FROMtableWHEREcondition(s)};比较运算符操作符含义=等于(不是==\color{red}{不是==}不是==)>大于>=大于、等于<小于<=小于、等于<>不等于(也可以是!=\color{red}{也可以是!=}也可以是!=)其它比较运算符操作符含义BETWEEN…AND…在两个值之间(包含边界\color{red}{包含边界}包含边界)IN(set)等于值列表中的一个LIKE模糊查询ISNULL空值逻辑运
什么是SQL的函数?函数的类型单行函数字符函数示例:接收字符输入返回字符或者数值,dual\color{red}{dual}dual是伪表1.把小写的字符串转换成大写的字符:upper(str)selectupper('tomcat')fromdual;2.把大写字符变成小写字符:lower(str)selectlower('TOMCAT')fromdual;3.把首字符大写:initcap(str)selectinitcap('tomcat')fromdual;4.字符串的连接可以使用concat或使用“||”,建议使用"||"concat(str1,str2)selec
什么是多行函数(分组函数)?分组函数作用于一组数据,并对一组数据返回一个值。也叫:组函数,分组函数组函数会忽略空值:NVL函数使分组函数无法忽略空值\color{red}{组函数会忽略空值:NVL函数使分组函数无法忽略空值}组函数会忽略空值:NVL函数使分组函数无法忽略空值常用的多行函数AVGCOUNTMAXMINSUM多行函数示例1.统计记录数count()示例:查询出所有员工的记录数selectcount(*)fromemp;注意:不建议使用count(*),可以使用一个具体的列以免影响性能。selectcount(ename)fromemp;2.最小值查询min()示例:查询出来员工最低
什么是笛卡尔积?Oracle的连接条件的类型等值连接不等值连接外连接自连接Oracle多表连接示例1.多表连接基本查询使用一张以上的表做查询就是多表查询语法:SELECT{DISTINCT}*|列名...FROM表明别名,表名1别名{WHERE限制条件ORDERBY排序字段ASC|DESC...}示例:查询员工表和部门表select*fromemp,dept;我们发线产生的记录数是56条,我们还会发现emp表是14条,dept表是4条,56正是emp表和dept表的记录数的乘积,我们称其为笛卡尔积。如果多张表进行一起查询而且每张表的数据很大的话笛卡尔积就会变得非常大,对性能造成影响,想要去掉笛
什么是子查询?使用子查询解决问题:谁的工资比SCOTT高?子查询的语法子查询(内查询)在主查询之间一次执行完成。\color{red}{子查询(内查询)在主查询之间一次执行完成。}子查询(内查询)在主查询之间一次执行完成。子查询的结果被主查询使用(外查询)。\color{red}{子查询的结果被主查询使用(外查询)。}子查询的结果被主查询使用(外查询)。子查询的类型单行子查询只返回一条记录单行操作符操作符含义=Equalto>Greaterthan>=Greaterthanorequalto<Lessthan<=Lessthanorequalto<>Note
什么是集合运算?并集示例:查询10号和20部门的员工select*fromempwheredeptno=10unionselect*fromempwheredeptno=20;交集示例:显示薪水同时位于级别1(700~1300)和级别2(1201~1400)的员工信息。selectename,salfromempwheresalbetween700and1300intersectselectename,salfromempwheresalbetween1201and1400;差集示例:显示薪水同时位于级别1(700~1300),但不属于级别2(1201~1400)的员工信息。selectena
创建表空间表空间是Oracle数据库的逻辑单元。数据库–表空间。一个表空间可以与多个数据库文件(物理结构)关联一个数据库下可以建立多个表空间,一个表空间可以建立多个用户、一个用户下可以建立多个表。createtablespacezhangsdatafile'd:\zhangs.dbf'size100mautoextendonnext10m;zhangs:为表空间名称datafile:指定表空间对应的数据文件size:定义的是表空间的初始大小autoextendon:自动增长,当表空间存储都占满时,自动增长next:指定的时一次自动增长的大小用户1.创建用户createuseractoniden
常见的数据库对象对象描述表基本的数据存储集合,由行和列组成视图从表中抽出的逻辑上相关的数据集合序列提供有规律的数值索引提高查询的效率同义词给对象起别名视图什么是视图?视图是一个虚表\color{red}{虚表}虚表视图建立在已有表的基础上,视图赖以建立的这些表称为基表\color{red}{基表}基表向视图提供数据内容的语句为select语句\color{red}{select语句}select语句,可以将视图理解为存储起来的select语句\color{red}{存储起来的select语句}存储起来的select语句视图向用户提供基表数据的另一种表现形式最大的优点就是简化复杂的查询。\col
数据操作语言DML(DataManipulationLanguage-数据操作语言)可以在下列条件执行:向表中插入数据修改现存数据删除现存数据事务是由完成若干项工作的DML语句组成的插入数据insert语句语法:insertintotable[(column[,column...]}]values(value[,value...]);使用这种语法一次只能向表中插入一条\color{red}{一条}一条数据。为每一列添加一个新值。按列的默认顺序列出各个列的值。在insert子句中随意列出列名和它们的值。字符和日期型数据应包含在单引号中。\color{red}{字符和日期型数据应包含在单引号中。}
什么是PL/SQL?PL/SQL(ProcedureLanguage/SQL)是Oracle对sql语言的过程化扩展,指在SQL命令语言种增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单、高效、灵活和实用。示例:为职工涨工资,每人涨10%的工资。updateempsetsal=sal*1.1;示例:按职工的职称涨工资,总裁涨1000元,经理涨800元,其他人员涨400元。这样的需求我们就无法使用一条SQL来实现,需要借助其他程序来帮助完成,也可以使用pl/sql。PL/SQL的
在写Java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候就需要用到游标,游标可以存储查询返回的多条数据。游标的属性属性描述%notfound如果fetch失败,那么该属性就会返回true;否则返回false;%found如果fetch成功,那么该属性就返回true;否则就返回false;%rowcount返回已经fetch了的记录数,即影响的行数%isOpen如果游标已经打开,那么该属性就返回true;否则就返回false语法:CURSOR游标名[(参数名数据类型,参数名数据类型,...)]ISSELECT语句;例如:cursorc1isselectenamefromemp