管理信息化ORACLEOracle 笔记_第1页
管理信息化ORACLEOracle 笔记_第2页
管理信息化ORACLEOracle 笔记_第3页
管理信息化ORACLEOracle 笔记_第4页
管理信息化ORACLEOracle 笔记_第5页
已阅读5页,还剩306页未读 继续免费阅读

下载本文档

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

文档简介

第四种方法:写成磁盘文件1.存储大量数据,方便检索和访问2.保持数据的一致、完整3.共享和安全4.通过组合分析,产生新的有用信息★使用磁盘文件储存数据初级阶段--第一代数据库★出现了网状模型、层次模型的数据库★关系型数据库和结构化查询语言★“关系-对象”型数据库Oracle------甲骨文Sybase-------赛贝思实体(Entiy):客观存在的、可以被描述的事物。如员工、部门属性(Attribute):用于描述实体所具有的特征或特性,如使用编号、姓名、部门、工资等属性员工的特征。关系(Relationship):实体之间的联系。如部门和员工之间有一对多的关系。数据模型:也叫关系模型,是实体、属性、关系在数据库中的具体表现。行和列:行代表一个具体的实体数据。也叫一条记录。课程目标:●Oracle安装及配置●事物控制●索引视图●存储过程●触发器●权限管理●数据库的备份与恢复●数据库设计Oracle的创始人是:LarryEllision创办了Oracle公司。Oracle8i:Internet表示此时Oracle公司开始开始正式进军互联网.Oracle9i:Oracle8i和Oracle9i相比是非常相似的

Oracle是由甲骨文公司生产的以高级结构化查询语言(SQL)为基础的大型关系数据库,通俗地讲它是用方便逻辑管理的语言操纵大量有规律数据的集合。是目前最流行的客户/服务

是目前市场占用率极高的一款数据库产品特点:◆提供了基于角色(ROLE)分工的安全保密管理。在数据库管理功能、完整性检查、安全性、一致性方面都有良好的表现。◆支持大量多媒体数据,如二进制图形、声音、动画以及多维数据结构等。◆提供了与第三代高级语言的接口◆提供了新的分布式数据库能力。可通过网络较方便地读写远端数据库里的数据,并有对称复制的技术。物理结构:和应用程序的增大而变化。表空间内存储着各项应用的数据、索引、程序等相关信息。监听器服务。3.sqlplus工具sqlplus工具登录数据库有以下几种方式:(1).sqlplus:以命令的方式进入数据库连接处输入数据库的名称,如果不输入,会进行默认的,一般默认的是最后一个数据库。那么登录帐户以后,就可以在数据库中进行增、删、改、查等操作。补到了下一行。这样看下来表就很混乱,不规范。所以我们要对其环境进行一下设置。如设置每行显示的长度:setlinesize300;所我们可修改每页显示行数。4.命令我们通常使用的sqlplusw在sqlplusw下编辑代码时,出现了错误,不允许我们使用向左方向键向右移动到相应的位1.Sqlplus用户/密码[as身份]sys:系统用户名sys具有最大的权限。scott:它是一个oracle示例/学习帐户3.停止和启动Oracle/是以操作系统认证进行登录4.创建、删除用户△创建帐户:MUNLIMITED----------------------->没有限制如创建一个hellen的帐户:createuserhellenidentifiedbyabcd;△删除帐户:如:删除用户hellen:dropuserhellen;△用户修改密码:如:alteruserhellenidentifiedbyabc123;△用户解锁:如:alteruserhellenaccountunlock;△查看当前登录用户△查看系统有哪些用户:如:△查看用户的默认表空间△查看用户有哪些表空间△确定用户帐户所授予的权限select*fromDBA_tab_privs;直接授予用户帐户的对象权限select*fromDBA_role_privs;授如授予可以连接到数据库的权限:granthellentoscott;connect(8)连上Oracle,做最基本操作resource(5)具有程序开发最基本的权限exp-full-database可把数据库整个备份输出的权限基本语法:类型很适合存储纯文本信息。储图片/文档世纪中哪一年、月份、月中的哪一天、小时、分钟和秒。(2)伪列可以从表中查询,但不能插入、更新和删除它们的值快速地定位表中的一行。例:一般读作:[si:kju:]或者是字母SQL的发音。准,在实际中,各个数据库就是提供的函数不同。控制语言。1.DDL(DataDefinitionLanguage)数据定义语言:定义数据库对象(表(1)事务是最小的工作单元,作为一个整体进行工作(2)保证事务的整体成功或失败,称为事务控制或rollback才认为是结束了。如果要永久性的提交可以执行:mit命令,再次打开新的窗口时就可要回到原点了,也就是刚才所做的都等于没做,所有rollback回退是将所有的回退。因为rollback回退是将所有的都回退了,这明显不太好,那么我们可以设置几个回退点,使再次回退的时候,不让其回退到原点,而是回退到我们固定的位置上去。如:1.算术操作符:算术操作符包括加(+)、减(-)、乘(*)、除(/)。2.连接操作符用于将多个字符串或数据值合并成一个字符串例:要求查出雇员的编号、姓名、工作但是显示的格式是:SELECT'编号是:'||empno||'的雇员,姓名是:'||ename||'工作是'||job;---->使用了连在查询中也可以使用四则运算功能。如我们要查每个雇员的姓名及年薪。例:4.逻辑操作符逻辑操作符用于组合多个计较运算的结果以生成一个或真或假的结果。注二、在使用集合操作符时,两个表的类型一定算术操作符--------最高优先级OR逻辑操作符--------最低优1.创建表空间基本语法:DATAFILE‘d:\’如:createtablespacejavasky-datafile'd:\'----->目录地址size20M----------------------->大小为20M2.删除表空间基本语法:注意表空间的名字需要使用双引号包围,并且表空间的名称需要大写。3.查看表空间的名称和状态4.修改表空间的状态altertablespace表空间名状态;可以修改表空间的状态第一种、select*fromcat;第二种、select*fromtab;●建表如:createtablestudent(idint,namevarchar2(5),addressvarchar2(10));如deststudent;如名称、类型、是否为空。●修改表1.增加新列2.删除旧列3.修改列类型(要求,列中无数据)4.修改列名5.修改表名●插入(记录)数据,也就是给列赋值1.给其相应的字段赋值:INSERTINTO表名[(列名1,,,,)]VALUES(值1,,,);注:[]中的内容2.赋全值INSERTINTOstudentVALUES(1,'李小龙','河北省');3.赋值以后查看该表的内容:select*fromstudent;4.插入日期格式的值:●修改记录●删除(记录)数据●利用现有的表创建表语法:如:为空。可回滚。function_name(columnleexpression,[arg1,arg2.....])expression:字符串或计算表达式arg1,arg2:函数中使用的参数日期运算:-------------------------------------------------------------------------------Initcap(char):将首字母转换为大写eg:Selectinitcap('hello')fromdual;------->HelloLtrim(char,set):从左边开始截取字符(一般用来截取空格)Trim():从两端截取Rtrim(char,set):从右边开始截取字符(右截空格)Translate(char,from,to):替换单个字符4eg:Selecttranslate(‘jack’,’j’,’b’)fromdual;------->backReplace(char,searchstring,[repstring]):替换多个字符eg:Selectreplace(‘jackandjue’,’j’,’bl’)fromdual;------->blackandblueInstr(char,m,n):返回一个数值型,标识截取的字符的位置,从1开始计,第一次出现的eg:Selectinstr(‘worldwide’,’d’)fromdual;------->5eg:Selectsubstr(‘abcdefg’,3,2)frC-----C*******abc-----------------------------SQL>SELECTDECODE(id,1,'tom',2,'jack',------jackhellen5.数字函数Selectabs(-15)fromdual;Ceil(n)Selectceil(44.778)fromdual;-.Selectcosh(0)fromdual;1Floor(n)Selectfloor(100.2)fromdual;1Selecttrunc(100.256,2)fromdual;Sqrt(n)Selectsqrt(4)fromdual;20Sign(n)Selectsign(-30)fromdual;6.转换函数-------------●为表增加约束●设置表所在的表空间●使用序列实现自动增长约束是在表上强制执行的一些数据校验规则,被插入/修改/删除的数据必须符合在相关字段语法:列定义......推荐采用:表名_列名_约束类型简写(1)该列的值不能为空(2)列级约束(2)列级约束、表级约束(3)取名:表名_列名_uk如:名字不能为空且唯一));如果是先创建了表来要增加约束可以写成:(1)用来唯一标识这一行记录,一个表中只能有一个主键(2)功能上相当于非空且唯一(3)列给约束、表级约束(4)取名:表名_列名_pkcreatetabledepts(idintprimarykey,---->将id设置为主键descriptionvarchar(100));(5)主键有一个最主要的作用是:当两个表关联时,主外键时,要求引用的主表中的字段一定要为主键。(1)用于两表间建立关系,需要指定引用主表的那列(2)列级约束表级约束(3)命名:主表名_子表名_FK(4)语法:--部门表注表createtabledepts(dept_idintprimarykey,descriptionvarchar(20));--员工表子表addressvarchar(20),dept_idint,foreignkey(dept_id)referencesdepts(dept_id)--主键);语法:例:referencesdepts(depts_id);表中被使用,则不允许修改此主键值。除。例:3foreignkey(dept_id)4referencesdepts(dept_i5ondeletesetnull;--->删除后设置为空不存在了,该记录的引用就就变为空了。(1)对某列的值进行范围限制、格式限制等(2)列级约束、表级约束(3)取名:表名_列名_ck例:2idintprimarykey,5);6.删除约束如:删除sal上的约束例:名称是否为空?类型7.指定表空间如:descuser_tablespace;----->查看所有的表空间createtablestudent(idint)tablespacesystem;8.创建序列创建语法:从序列中取值:Select序列名.nextvalfromdual;--nextval序列中的下一个值如创建一个序列:2startwith11----------1currval不论执行多少次都是1.往部门表中插:insertintodeptsvalues(seq_,"财务部");SELECTselection_list1.查询所有记录的所有列2.查询特定行3.查询特定列4.去掉重复的值5.给列取别名SELECT列名....1.除了张三以外的所有员工:4.有奖金的5.所有姓张的6.姓张的且名字是3个字的。7.在2008.1.1入职的女员工SELECT列名....例:desc;四、在Oracel用“||”表示字符串的连接。如实现如下查询:要求查出雇员的编号、姓名、工作但是显示的格式是:SELECT'编号是:'||empno||'的雇员,姓名是:'||ename||'工作是'||job;在查询中也可以使用四则运算功能。如我们要查每个雇员的姓名及年薪。但是在查询的结果中是以sal*12的字段显示的,这样的看起来让人不太明白,不知道到底●多表连接查询1.使用单个SELECT语句从多个表中取出多个相关的数据,通数据的查询。2.多表连接通常是建立在相互关系的父子表上的。-------------------------------------join_table:参与连接的表join_condition:连接条件●内连接1.语法selecta.id,,c.scorefromainnerjoinbona.id=b.idinnerjoinconc.id=b.id[where];2.只列出这些连接表中与连接条件相匹配的数据行如:=非等值连接:在连接条件中使用除了等号运算符以外其它比较运算符来比较被连接的列值.自连接:在连接条件中使用等号(=)运算符来比较被连接列的列值,但他使用选择列表指出如果表的名字很长,可以给其起一个别名如:还可以写成:fulljoindept●记录联合运算,删除重复的记录再返回结果。●子查询中的in和exists表A表Bexists需要把表进行关联,in不一定需要。如何选择in还是exsits?作用在子查询上使用exists。在数据量较大时,exists的效率高于in.2.分组统计级统计函数的使用3.子查询,并结合多表查询,分组统计做复杂查询4.数据库的更新操作5.数据库的更新操作6.事务处理及数据库死锁之前在查询的时候都是在一张表中查询,那么在一张表以上的查询就叫做多表查询。基本语法:发中不介意过多的使用的。要想去掉笛卡尔积,必须使用字段进行关联的操作。范例:修改之前的查询操作:此时只有14行记录了,消除掉了笛卡尔积。此时又存在了一个新的问题,那么现在表名称所以要使用多表查询的时候,最好指定别名。范例:要求查询出雇员的编号、雇员的姓名、部门的编号、部范例:要求查询每个雇员的姓名、工作、雇范例:进上步扩展之前的程序,将雇员的所现在要求查询每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade),及其领先查询工资表的内容(salgrade)0--------------------------1.查每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade需要三张表进行selecte.ename,e.sal,d.dname2.此时雇员的工资等级已经求出,现在再求其领导的姓名及工资所在公司的等级。2.第四等级工资3.第三等级工资4.第二等级工资5.第一等级工资selecte.ename,e.sal,d.dname,DECODE(s.grade,1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',5,'第一等工资'),DECODE(,1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',5,'第一等工资').............部分已省略们添加一个(+)符号...............部分已省略..............部分已省略因为把(+)放在等号右边的时候没有变化,跟不加一样,所以默认是左连接。左右连接了。..............部分已省略--------------------------------------------------------------------------..............部分已省略子查询:在一个查询内部还包括另外一个查询,则称为子查询。SELECT{DISTINCT}*|查询列1别名1|查询列2别名2..(SELECT{DISTINCT}*|查询列1别名1|查询列2别名2..)别名(SELECT{DISTINCT}*|查询列1别名1|查询列2别名2..)}1.单列子查询:返回的结果是一列的一个内容2.单行子查询:返回多个列,有可能是一个完整的记录一般在程序开发中单列子查询是用的最多的。范例:要求查询出:部门的名称、部门的员工数、部门的平均工资、部门的最低收入雇员的姓名。进行分组。如果此时在一个部门之中同时出现两个雇员的工资是最低的,那么这个程序是错误的。对于子查询来讲,还可以进行多列子查询,一个子查询中同时可以返回多个查询的列。分组:如将男生分为一组女生分为一组。如果想求出每一组的平均身高、平均年龄,这就是使用到分组函数。-------------------SELECT{DISTINCT}*|查询列1别名1|查询列2别名2..要分组时要注意:在查询的时候,以上的代码不能正确的执行是因为:1.如果程序中使用了分组函数,则有两种可以使用的情况:(2)如果不使用分组的话,则只能单独的使用分组函数。2.在使用分组函数时,不能出现分组函数和分组条件之外的字段。范例:按部门分组,并显示部门的名称及部门的员工数。错误的代码:二种条件的指令:SELECT{DISTINCT}*|查询列1别名1|查询列2别名2..分组的简单原则:只要一列上存在重复的内容才有可能考虑到分组。错误的代码:正确的代码:5.理解数据库的设计范式视图的功能:一个视图实际上就是封装了一个复杂的子查询。创建视图的语法:建立一个视图,此视图包含了全部的20部门的雇员信息(雇员姓名、编号、工作、雇佣日期)。视图在创建完成之后,我们就可以像查找表一样直接对视图进行查询操作。此时是通过视图找到20部门的全部信息,也就是可以发现,可以使用视图包装需要的的查加一个sal字段。结果:名称已由现有对象使用说明视图是无法重名的。此时只能先删除后重新建立。但是如果所有的操作都是这样操作很麻烦。因为如果要想修改视图必须先删除视图,在作用以上的语法,在更改视图之前就不用再删除重建了。所以视图的作用:可以封装复杂的查询,那么下面封装一个已经存在的复杂查询。如这是一个复杂的子查询:便使用。如:结果是一样的。理论上是不允许修改的。----------------------------------------------------------------------------------------------------------------------------------................部分已省略说明创建条件再更改,那么其它字段呢,现在将7369的雇员姓名修改为“hellen”-----------------------------------------------------------------------------------------------------------------------------------------------...............部分已省略数视图无法更改,是只读的操作。在很多数据库系统中存在一个自动增长的列,如果现在要想在Oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。序列的创建格式:作,)------------->表已创建向表中添加数据,添加数据的时候,需要手工......-----------------------------从结果中可以发现,nextval始终在进行自动增长的操作,而currval使用取出当前操作的序列结果。进行数据插入操作。99------->每次增长的幅度是2其结果为:-------------------------数据库的对象包括:同义词、序列、视图、索引。之前一直存在这样的查询语句:-----------------------------------------------是用户.表名。如:select*from;表名称”如:select*fromdual代替了select*from;词之后就可以了。2.创建同义词2.隐藏对象的名称和所有者3.提供对对象的公共访问1.私有同义词只能在其模式内访问,且不能与当前模式的对象同名。(这三、创建或替换现有的同义词:叉树)。●索引是与表相关的一个可选结构2.减少磁盘I/O4.在逻辑上和物理上都独立于表的数据●索引有各种类型,除了标准索引外,还有一些特殊类型的索引:唯一索引、位图索引、组合索引、基于函数的索引、反向键索引。●创建标准索引:●唯一索引的值是不能得复的,我们在创建主键时会自动创建一个唯一索引。所以表中如果有主键了,就不用去创建唯一索引了。●组合索引组合索引是在表的多个列上创建的索引。就像我们在创建主键时,可以多列的进行创建。ONitemfile(p_category,itemrate);●反向键索引如:将个反射键索引恢复成正常索引:注:但是普●位图索引:Oracle位图索引主要是应用在数据仓库方面,其目的是查询效率更高,占用更小的索引空间,使用存储更有效,位图索引使用压缩形式存储使用位图索引的注意事项:位图索引应该建立在每一个事实表的外键列上。(这只是一个一般的规则.)位图索引适用在低基数列上(大量重复数据)●索引的创建原则一个表允许创建几百个索引,通常我们都不会这样做,因为索引提高了查询效率,同时也给如果某几个字段经常一起出来做为条件,则创建多列索引(组合索引)。频繁更新。●聚簇索引顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。聚簇索引一般用于表的联接字段,比如,部门表的部门编号与员工表的所属部门,创建聚簇索引要先创建聚簇,然后把表的字段放置到簇中接查询速度。创建一个簇表:●索引组织表)普通表与索引组织表的比较:●基于函数的索引●获取索引的信息●使用索引●数据库对象总结:如果其它的服务齐全,我们可以后添加一个监听。●Oracle查询工具●Oracle默认用户●更改和删除用户该服务启动数据库服务器的监听器,监听器接受来))以上操作是最通用的操作,而且本身也是属于最正确的操作,但是是在O字段的类型,所在嵌套表本身也需要同样指定类型,那么这种类型就需要单独定义。);/为此类型指定一个名称。/projectsproject_nt对于插入数据来讲,需要需要指定每一个project_ty的类型。project_nt(project_ty(0002,'ERP',SYSDATE),//ERP为项目));此时查询嵌套表,可以返回多个项目。如果此时需要查询一个部门的全部项目的话,则需要查询嵌套表。--------------------------------------------------------------------------可见将一个部门中的统一的全部项目查询出来了。二、可变数组(了解)行了限制。例如:1.在一个部门有多个工人,如果按照可变数组的做法,肯定首先要做出一个工人的类型。5)类型已创建。2.面再定义数组类型:worker_info_list类型已创建。3.定义部门表,一个部门可能存在多个工人4workersworker_info_list5);表已创建。4.插入测试数据2worker_info_list(3worker_info(1,'李小龙','男'),4worker_info(2,'张三','男'),5worker_info(3,'李君','女')6)7);-----------------------------------------------------------------------------------------------以上是基础,以下是高级对象PL/SQL游标的使用-----------子程序达到功能更复杂的一些操作。完成了操作。比如什么时候插值,什么时候修改,可以有条件来限定了。如给一个班级的每个人都提10分,就可以用循环为完成操作。性。到服务器端编译执行,然后返回给客户端一个请求结果,语句得逐个一条一条的进行编译,个人只需调用一次就可以了。所以这一点就可以节约带宽,减少了网络流通量。不同的代码发给不同的引擎,当处理完之后,会给服务器一个集中,将结果返回给客户端。这是整个过程。5.安全性,可以通过存储过程限制用户对数据的访问。如我们写了一个存储过程,这里边可可以,至于里边操作的是那一个表,对那个表执行了什么操作,不必知道。该引擎接受PL/SQL块并对其进行编译执行。用户发出请求时候是一个他的执行完之后,Oracle服务器把结果合成declarations]----------------------------------------可执行部分handlers]例:--------------------------------------------------上:声明部分--------------------------------------------------下:主体部分(包括可执行部分和异常部分)----------------------------------------上:可执行部分----------------------------------------下:异常部分如:...icode:='i205';---第一种赋值SELECTp_category,itemrate...90----结果5DBMSLINE('员工工资为:'||v_sal);1.Natural(0-231)(非负及null)2.Positive(1-231)(正数和null)3.NaturalN(非空及非负)4.positiveN(正数和非null)5.signtype(要将整型变量限制为值-1,0,1)1,2,3,4用于防止将空值赋予整型变量。用于声明最高精度为38位十进制数字的定点数。定点数量用定点数。位十进制数字)浮点数.子类型:real:用于声明最高精度为63个二进制位(大约相当于18位十进制数字)浮点数。此数据类型用于存储带符号的整数。从上可以看出同一类型可以出现放不下的可能,所有用的时候有注意。大对象数据类型主要用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据。型6DBMSLINE('员工号为:'||v_rec_||'员工名为:'||v_rec_);使用属性类型的优点:息。......3(-----------不能用’-‘(减号);注意:一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.IF语句循环控制:顺序控制:createtabletoys(idintprimarykey,toynamevarchar2(2),toypricenumber);insertintotoysvalues(1,'a',200);insertintotoysvalues(2,'b',100);insertintotoysvalues(3,'c',90);----------------------11endif;7id=v_id;13endif;原值5:v_id:=&id;新值5:v_id:=2;原值5:v_id:=&id;新值5:v_id:=3;--带引号8ELSEDBMSLINE('没有此成绩')也可以写成:新值4:grade:='A';循环控制语句包括:循环控制的三种类型:范例:5exit;7endif;8daily_value:=daily_value+10;9dbmsline('每日销量:'||daily_value);11dbmsline('每月销量:'||monthly_valu2iint:=0;5dbmsline(i);6i:=i+1;9foriin1..10loopdbmsline(i);foriinreverse1..100loopdbmsline(i);4.顺序结构顺序控制语句包括:例:relevel_level%type;[INTOdefine_variable_list]2executeimmediate'createtabletest(idint)';--->语句放在单引号中,2sql_stmtvarchar2(200);就是Oracle系统根据用户经常出现的错误,预先定义出来的一些异常。如返回多行时,就会触发一个预定义异常。7dbmsline('返回太多行');如果不加异常处理部分:4selectsalintov_fromemp;--不定义异常,直接*7dbmsline('无符合条件的数据');处理用户定义异常需要三步:2e_testexception;--声明异常e_test6ifv_namenotin('a','b','c')then7raisee_test;--引发异常8endif;9--处理异常12dbmsline('输入的信息不在规定的范围内');新值5:v_name:='a';新值5:v_name:='e';2e_testexception;--声明异常6ifv_namenotin('a','b','c')then7raisee_test;--引发异常8endif;9--处理异常12raise_application_error(-20001,'输入的信息不在规定的范围内');--产生错误的时候,同时生成一个号,类似于预定义错误。新值5:v_name:='/';*●执行原理:行●作用:逐行处理查询结果,以编程的方式访问数据查询的结果)样。将结果存到内存区域里边,然后Oracle提供了一种机制,游标就像一个指针一样,可以指定他的记录,第一次指向第一条,一直往下,直到结束。6dbmsline('已更新');7endif;已更新----打印出来了,说明更新,是真6dbmsline('没有更新');7else8dbmsline('已更新');9endif;6dbmsline('没有相关更新');7else9endif;6dbmsline('没有相关更新');7else10dbmsline('游标已打开');12dbmsline('游标已关');--始终都是关着的13endif;14endif;显式游标(重点)查询,用的最多。基本步聚:声明游标打开游标提取关闭1.带参数的显式游标ISselect_statement;----------------------------------------------------------------------3--注:定义参数时,只需要给定一个类型就可以了,不用给定8fetchtoy_curintoa;--提取10dbmsline('玩具名:'||a.toyname||'价格为:'||a.toyprice);12closetoy_cur;--关闭原值6:opentoy_cur(&price);--需要输入的值新值6:opentoy_cur(100);--需要输入的值玩具名:f价格为:600-------------------------------->很明显带有参数的游标要给不带参的灵活。其>100元2.使用显式游标更新行--创建游标select*fromtoys;dbmsline('符合要求的有:'||'玩具名'||toys_||'价格为'||toys_);符合要求的有:玩具名c价格为90select*fromtoys;-----------------select*fromtoys;dbmsline('符合要求的有:'||toys_);select*fromtoys;------------------3.循环游标循环游标的语法如下:--toy_rectoys%rowtype;--toy_rec变量在此处定义可不定义,就像if语句中的i变量,不cursortoy_curisselect*fromtoys;fortoy_recintoy_curdbmsline(toy_||toy_||toy_);--closetoy_cur;注:同理不用关闭●REF游标和游标变量执行时给游标设定一个查询。使用的频率很少。主要是以游标变量的形式进行操作的。创建游标变量需要两个步骤:--------------------------------------REF游标分为两种类型:弱类型和强类型。它们的区别差一个弱类型游标不能放入包中。2typeref_toy_curisrefcursor--声明一个REF游标5cur_toyref_toy_cur;--声明一个REF类型的变量9fetchcur_toyintov_rec;13closecur_toy;a4curc_type;9orderbysaldesc'--排序11DBMSLINE('薪水大于'||p_salary||'的员工有:');16||'姓名:'||r_||'薪水:'||r_);●游标变量的优点和限制游标变量的功能强大,可以简化数据处理。(2)可以作为过程的参数进行传递(3)可以引用游标的所有属性(4)可以进行赋值运算(1)不能在程序包中声明游标变量(3)不能使用比较运算符来使用,我们叫这个为匿名块,没名字。子程序的各个部分:声明部分、可执行部分、异常处理部分(可选)子程序的分类:1.过程-执行某些操作2.函数-执行操作并返回值●子程序-过程过程是用于完成特定任务的子程序。创建过程的语法:IS|AS--选一个,两个意义是一样的<localvariabledeclaration>--本过程要使用的变量9dbmsline('没有此人:');过程已创建。执行过程的语法:10endif;过程已创建。--调用子程序过程5dbmsline('工资标准:'||v_sal);7x:=y;过程已创建。--调用参数5swap(a,b);将过程的执行权限授予其他用户:创建函数的语法:[localdeclarations]创建函数:IS/注:函数是不能单独存在的,要跟其它部分共同构9return'工资在范围内';11return'不在范围内';12endif;-----------------------------------------------●调用自定义函数位置表示法functionName(arg1[,混合表示法:同时使用位置表示法和名称表示法为函数传递参数。名称表示法。调用get_salary函数11dbmsline('没有选定的信息');13dbmsline('错误代号'||sqlcode);--调用函数6dbmsline('工资总和为:'||v_sum||'人员个数为:'||v_count);--按名称调用--混合调用●创建参数带有默认值的函数2fun_def(namevarchar2,ageint,sexvarchar2default'男5v_resultvarchar2(50);7v_result:='姓名:'||name||'年龄:'||age||'性别:'||sex;8returnv_result;2v_resultvarchar2(50);4--v_result:=fun_def('李龙',20);6dbmsline(v_result);姓名:杰克年龄:23性别:男--------默认为男也可以加上性别:2v_resultvarchar2(50);5dbmsline(v_result);姓名:多莉年龄:23性别:女●过程和函数的比较:2is3v_locvarchar2(30);6dbmsline(v_loc);7rollback;--注:回滚过程已创建。2is3v_locvarchar2(20);2is6first();--在第2个过程中调用第1个过程8dbmsline(v_loc);过程已创建。之所以改动后的值没有被保留,是因为在first中有一个rollback;2is3v_locvarchar2(30);7dbmsline(v_loc);8rollback;过程已创建。3v_locvarchar2(20);6first();8dbmsline(v_loc);过程已创建。主事(first)务处理启动独立事务处理1.与主事务处理的状态无关2.提交或回滚操作不影响主事务处理4.能够启动其他自主事务处理程序包是对相关过程、函数、变量、游标和异常等对象的封装。程序包由规范和主体两部分组成。在规范中可以声明:包括类型、变量、常量、异常、游标规在主体中可以声明:对象和实现在包规范中声明●创建程序包1.程序包规范IS|AS[Publicitemdeclarations]2.程序包主体IS|AS[Privateitemdeclarations]Initialization]4--过程及函数的规格声明5--实现创建一个过程8functionfun_firstreturnvarchar2;--函数程序包已创建。●程序包的优点:模块化、更轻松的应用程序设计、信息隐藏、新增功能、性能更佳●程序包中的游标:在包中声明游标的要求:2.程序员定义的记录类型创建游标程序包范例:程序包已创建。15dbmsline('名为:'||v_rec_||'工资:'||v_rec_);程序包体已创建。--调用包中的过程●有关子程序和程序包的信息●总结:程序包是对相关类型、变量、常量、游标、使用程序包的优点是:模块化、更轻松的程序设计、信息隐藏触发器的功能:3.提供审计和日志记录(在我的数据库执行了什么样的操作都可以记录下来)4.启用复杂的业务逻辑(是与多个表相关的如:从一个员工辞职了,其中的一个表中删除了所以触发器是数据库的高级使用。●触发器的组成部分触发器由三部分组成:):2.触发器限制:执行触发器的条件,该条件必须为真才能激活触发器3.触发器操作(主体):有触发器的条件为真是,触发器的主体才会运行。后操作表,如果是多后,先操作表,后执行触发器的主体。每一个符合条件的行,他都会去执行,常用的是行级。单独执行一次。触发器最常用的对象是表。●创建触发器语法trigger_body;语法分析:●每张表最多可建立12种类型的触发器,它们是:如果12个都创建时容易落入一个灾难,因为创建以后,只要一符合条件就会自动触发,有可能产生递归,所以触发器要适量而止。触发器的执行顺序:●触发器的限制:触发器被激活时的特殊对象:触发器的发、创建:为salary_records表创建trig-sal触发器●触发器的类型有:●触发器的组成部分示例例1:为salary_records表创建trig-sal触发器…操作:sal_diff:=:-:;DBMSLINE(‘工资差额:’sal_diff);●工作原理:●总结:createorreplacetriggertrigafterinsert--频率--主体if(:=0)thendbmsline('有一个玩具的价格为0');endif;--插入一条数据启动触发器SQL>insertintotoysvalues(4,'水枪',0);--触动了触发器SQL>insertintotoysvalues(5,'游戏机',10);--没有触动触发器二、触发器的分类:2.数据库级触发器:在发生打开、关闭、登录和退出数据库等系统事件时执行。4.语句级触发器:无论受影响的行数是多少,都只执行一次--inserting谓词,插入ifinsertingthenselectinto:fromdual;elsedbmsline('不能修改ID的值');endif;给A表中插入值:insertintoAvalues(10,'jack');---------------5jackifinsertingthenselectinto:fromdual;elsedbmsline('不能修改ID的值');raise_application_error(20003,'不能修改ID的值');endif;创建一个触发器:createorreplacetriggertrigifinsertingthendbmsline('在表中执行了插入操作');elsifupdatingthendbmsline('在表中执行了更新操作');elsedbmsline('在表中执行了删除操作');endif;触发器创建完成之后,对表进行一系列操作如:创建一个表用来记录:创建一个触发器:SQL>createtableB(idint);表已创建。表已删除。删除触发器:制。他主要是对视图进行操作的,如果不对视图操作没什么意义。3.理解数据库的规范化-三大范式●为什么需要设计数据库?1.节省数据的存储空间2.能够保证数据的完整性3.方便进行数据库应用系统的开发糟糕的数据库设计:1.数据冗余、存储空间浪费3.数据更新和插入的异常●软件项目开发周期1.需求分析阶段:分析客户的业务和数据处理需求;2.概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整;行审核;4.代码编写阶段:选择具体数据库进行物理实现,并编写代码实现前端应用;5.软件测试阶段:……6.安装部署:……●设计数据库的步骤1.收集信息:与该系统有关人员进行交流、坐谈,充分理解数据库需要完成的任务。用户注册和登录,后台数据库需要存放用户的用户发贴,后台数据库需要存放贴子相关信论坛版块管理:后台数据库需要存放各个版块信息,如版主、版块名称、贴子数等;2.标识对象(实体-Entity)如:实体一般是名词:3.标识每个实体的属性(Attribute)如:论坛用户:呢称、密码、电子邮件、生日、性别、用户的等级、备注信息、注册信息、主贴:发贴人、发贴表情、回复数量、标题、正文、点击数、状态、最后回复时间。回贴:帖子编号、回帖人、回帖表情、标题、正文、回帖时间、点击4.标识对象之间的关系(Relationship)如:跟贴和主贴有主从关系:我们需要在跟贴对象中表明它是谁的跟贴;版块和用户有关系:从用户对象中可以根据版块对象查出对应的版主用户的情况;主贴和版块有主从关系:需要表明发贴是属跟贴和版块有主从关系:需要表明跟贴是属于哪个版块的;5.绘制E-R(Entity-Relationship)实体关系图如:标识每个表的主键列,需要注意的是:没有主键的表添加ID编号列,它没有实际含义,用●数据规范化),如在一个表中的一列的值为:中国北京,这就违反了第一范如图:2.第二范式如果一个关系满足1NF,并且除了主键以外的其他列,都依赖与该主键,则满足第二范式如有一个表其字段为:3.第三范式起来关系。存在这样关系的字段是不能同时存在于一个表中的,也就是要直接关联的不要间接关联的。●规范化实例假设某建筑公司要设计一个数据库。公司的业务规则概括说明如下:公司承担多个工程项目,每一项工程有:工程号、工程公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工要重复输入大量的数据。这种重复的输入操作,很可能导致数据的不一致性。第4张表的字段包括:工程号、职工号、工时---->以工程号和职工号同时为主键,这是一●规范化和性能的关系1.为满足某种商业目标,数据库性能比规范化数据库更重要2.通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间),4.进行规范化的同时,还需要综合考虑数据库的性能。●总结在需求分析阶段,设计数据库的一般步骤为:收集信息、标识对象、标识每个对象的属性、标识对象之间的关系。在概要设计阶段和详细设计阶段,设计数据库的步骤为:3.应用三大范式规范化表格为了设计结构良好的数据库,需要遵守一些专门的规则,称为数据库的设计范式。在制作数据库时冗余是不可能是完全避免的,而且适当的冗余还可以提高性能。物理备份是对数据库的操作系统物理文件(如数据文件●故障类型在数据库无法正确读取或写入某个数据库文件时,●导出和导入实用程序使用以下三种方法调用导出和导入实用程序:1.命令参数行、交互提示符、参数文件命令参数行:在命令行指定执行程序的参数和参数值。交互提示符:以交互的方式提示用户逐个输入参数的值。●导出和导入数据库对象的四种模式是:1.完全数据库:导出和导入整个数据库中的所有对象2.表:导出和导入一个或多个指定的表或表分区3.用户:导出和导入一个用户模式中的所有4.表空间:导出和导入一个或多个指定的表空间中的所有对象---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------格式:使用参数文件导出数据:expsystem/aptechparfile='C:\'●导入实用程序有如下常用命令参数:----------------------------------------------------------------------------------------------------------------------------------------------FILE指定要导入的二进制文件名格式:使用参数文件导入数据:impsystem/oracleparfile='C:\'在安装完成之后可以使用两个命令进行数据库的备份与恢复。户名和口令(scott/tiger),进入到帐户以后,我们看一下在这个帐户下都有那些表有的表都导出完成之后,备份就完成了。检验备份的效果,我们把数据库中的表全部表删除,然后再进行恢复。1.数据泵导出和导入可以实现逻辑备份和逻辑恢复。2.数据泵导出和导入可以在数据库用户之间移动对象。4.使用数据泵导入可以实现表空间搬移使用注意事项:oracle客户端使用。3.两个工具的导出只能用各自对应的导入工具。1.scott/tiger指定由哪个一有户导出、2.directory:指定导出文体的路径3.dumpfile:指定导出的文件名4.tables:指定导出的表的集合如下:2.导出方案普通用户只能导出自身方案,如果要导出其他方案,由要求用户必须具有DBA角色或者3.导出表空间4.导出数据库导出数据库是指将数据库所有对象及数据存储到转储文件中选项来完成的。数据泵导入包括:导入表、导入方案、导入表空间、导入数据库等四种模式。1.导入表:--使用系统帐户2.导入方案:3.导入表空间4.导入数据库2.导出方案:2.导入方案:3.导入数据库表空间脱机--->备份表空间---->恢复表空确保数据库当前不处于归档方式--->设置相关数据库初始化参数--->在归档日志方式下启已连接。SQL>archiveloglist2.手动归档:手动归档允许用户手动归档非活动日志文件文件的已填充组现自己都有一个要求。因为主动权一直都是由数据库厂商把握,所以早期的java程序员要厂商来实现,那个数据库要和java相连,必须实现sun公司推出的这个接口。所以对于现有数据库的目的。如:Oracle数据库的驱动是:(.)如:(jdbc:oracle:thin:@localhost:1521:orcl)这是一个Oracle数据库的URL信息。用户如:(scott)密码如:(tiger)驱动程序(驱动程序会自动通过()方法注册)。try{(“.”);.println(“找不到驱动程序类”);}如:(url,user,pwd);staticConnectiongetConnection(Stringurl)staticConnectiongetConnection(Stringurl,Propertiesinfo)staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)publicclassdataSourse{//驱动程序名publicStringdriver=".";publicStringurl="jdbc:oracle:thin:@localhost:1521:orcl";//用户名publicStringuser="scott";//密码//获取连接的方法注:Connection()是一个接口,所以这是一个接口类型的方法//动态加载驱动程序(driver);//加载驱动Class类的forName()方法conn=(url,user,pwd);}//创建对象//输出连接对象.println(con);}}平时不这么做,而是将这些信息放到一个属性文件中。属性文件是以properties为扩展名driver=.url=jdbc\:oracle\:thin\:@localhost\:1521\:orcl然后我们可以在类中加载这个文件,加载properties文件有两个方法,一是利用构造器,静态区块也是在创建对象时执行,而且只执行一次,我们平时常用构造进行器加载。publicinterfaceIdataSource{//获得数据库连接//关闭数据库连接}//获取连接所需要的信息publicStringdriver="";publicStringurl="";publicStringuser="";//在构造器初始化时。加载属文件,获取相关信息publicdataSource(){//创建properties属性文件对象try{//加载属性文件(newFileInputStream("D:\\"));//文件所在路径//通过Properties对象的getProperty()方法获得相应的值driver=("driver");url=("url");user=("user");try{//动态加载驱动(driver);e.printStackTrace();}e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}//获取数据库连接return(url,user,pwd);;}//关闭数据库连接if(conn!=null&&!()){();}}}完数据库之后,如果确定不在需要连接,则必须用close()方法来关闭与数据库的连接,以释放连接时相关的必要资源。●Oracle数据库:驱动程序包名:ojdbc14.jar驱动类的名字:.要根据数据库的安装情况填写。其中各个部分含义如下:dbip–为数据库服务器的IP地址,如果是本地可写:localhost或。port–为数据库的监听端口,需要看安装时的配置,缺省为1521。jdbc:oracle:thin:@localhost:1521:allandb驱动程序包名:式。红色字体部需要根据数据库的安装情况填dbip–为数据库服务器的IP地址,如果是本地可写:localhost或。驱动类的名字:.根据数据库的安装情况填写。其中各个部分含义如下:dbip–为数据库服务器的IP地址,如果是本地可写:localhost或。jdbc:mysql://localhost:3306/allandb数据库连接的取得是一个非常消耗时间和资源的动作。取得一个数据库的间和资源,通常会实现一个连接池。如果有了连接池,那么我们有需要不需要时就将连接放回到池中,而不是直接关闭连接。使用ArrayList来实现连接池。接口:publicinterfaceIdataSource{//获得连接//关闭连接需要关闭其对象}我们要手动将他连带的对象关掉,如执行语现在创建一个连接池:publicStringdriver="";//驱动publicStringurl="";//jdbcURLpublicStringuser="";//用户privateintmax;//连接池中允许存放的最大连接数//用ArrayList实现连接池//在构造器初始化时,加载到属性文件,获取相关信息publicConnectioPool(){//创建Properties属性文件对象//加属性文件try{(newFileInputStream("D:\\"));//通过Properties对象的getProperty()方法获得相应的值driver=("driver");url=("url");user=("user");max=(("poolsize"));//加载驱动程序类(driver);e.printStackTrace();}e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}Setrs){if(rs!=null){try{();e.printStackTrace();}}if(stmt!=null){try{();e.printStackTrace();}}if(()==max){try{();e.printStackTrace();}}else{(connection);}}if(()==0){return(url,user,pwd);}else{return(()-1);}}}c3p0(推荐):proxool(推荐):最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。如:建表范例:publicstaticvoidmain(String[]args)throwsSQLException{//声明数据库连接池对象//获得数据库连接Stringsql="createtableA(idint,namevarchar2(10))";(sql);//注:executeUpdate()返回的一个整型if(stmt!=null){();}//关闭连接(con);}}法("inserintoA(1001,'Jack')");的是int类型的,表示记录变动的数据。而executeQurey()方法返回的是一个.ResultSet对象,代表查询的结果,查询的结果会一条一条的记录,可以使用ResultSet的next()方法来移至下一条记录,它会返回true或false表示是否有下一条记录,接着可以使用getXXX()方法来获得数据。例如:getString()getInt()getFloat()等方法分别获得相应字段类型的记录,getXXX()方法提供("id");//建议使用这种方式(1);publicstaticvoidmain(String[]args)throwsSQLException{//创建数据库连接池//获得数据库连接try{//执行查询等到一个结果集ResultSetrs=(sql);//循环读取结果集中的数据while(()){.print(("ename")+"\t");.print(("empno")+"\t");.println(("deptno"));}e.printStackTrace();}finally{//关闭Result对象//(rs);//(stmt);//关闭连接对象(con);}}}ResultSetexecuteQuery(Stringsql)ResultSet是一个接口他中有一个方法:将指针从当前位置下移一行。新数目。如果事先无法得知进行查询或是更新,就可以使用execute()方法。PrepareStatementstmt=("insertintojdbc(id,name)(?,?)");setInt()setString()setXXX()方法,制定?处真正应该有的参数,如:(1001);("lixiaolong");publicstaticvoidmain(String[]args)throwsSQLException{//创建数据库连接池//获得数据库连接Stringsql="insertintojdbcvalues(?,?)";(false);//ture为自动提交false为手动提交不写默认为自动提交PreparedStatementpstt=(sql).println("请输入ID");intid=();(1,id);//有两个参数第一个表示索引值,第二个是列名.println("请输入姓名");();();//提交事物注:事物有四个特性.println("赋值成功");}}即可。(false);("......");//SQL语句("......");//SQL语句("......");//SQL语句();():publicstaticvoidmain(String[]args)throwsSQLException{Stringsql="insertintojdbcvalues(?,?)";(false);//ture为自动提交false为手动提交不写默认为自动提交PreparedStatementpstt=(sql)//插入一万条记录作批量处理for(inti=1;i<5;i++){(1,i);(2,"JACK"+i);();}();//批执行语句();//提交事物.println("赋值成功");}}ResultSet数据的数据,即描述所查到的数据的背后的数据描述,用来表示表的名称,字段publicstaticvoidmain(String[]args)throwsSQLException{//声明数据库连接池对象//获得数据库连接//声明结果集对象ResultSetrs=null;

温馨提示

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

评论

0/150

提交评论