版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 可修改 欢迎下载 精品 Word 可修改 欢迎下载 精品 Word 可修改 欢迎下载 精品 Word一验证Oracle已经安装完成了,首先得确认程序里有这些个选项,有四个选项:Oracle Installation Products、集成管理工具、配置和移植工具管理员用得比较多、应用程序开发。Oracle也可以形成一种层次性的链接Directory Manager,对于我们来说用得最多是sqlplus,而OLE 是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件COM,他是微软提出的,在用VB开发时可能要用,对于我们来说不须管。当启动sqlplus时会提示输入用户名和口令,所谓的s
2、qlplus是Oracle的一个客户端。Oracle大多数命令都用命令来实现,所以比较难使,就如同unix比windows难使。口令你输入tiger,建议就用它,因为以后去企业里Oracle 9i就是用的这个口令。当你看到SQL命令符时说明已经进入到了Oracle的命令行了。图形版的sqlplus,命令行的sqlplus,还有一个就是通过网页访问Oracle的效劳,启动sqlplus,端口号是5560,URL是 HYPERLINK 非常有用,比方说你的机器上没有装上Oracle,就可以通过键入别人的IP,然后登陆到他的机器上来做实验,当然也可以安装特定的客户端软件实现。说实在的Oracle的这
3、个客户端太难看了,并且要记好多好多的命令,所以专门有一类公司专门为Oracle开发客户端。有一个比较著名的客户端叫Toad,当然Oracle还有一个客户端PL/SQL Develplor,这个用的也非常多。数据库管理时常用Toad英文蛤蟆的意思,如果有声卡的话,你启动一次它就叫一次。对我们来说sqlplus足够使了。以后有时机我使用一下PL/SQL Develplor,不过这个也不好使,因为你同时必须装上Oracle,还不如isqlplus好呢。以超级管理员身份链接数据库的方法是再命令行下敲入命令:sqlplus sys/口令 as sysdba。Sys和system的区别是sys是数据库管理
4、者,system是数据库所有者,sys用户拥有dba,sysdba,sysoper等角色或权限,是oracle权限最高的用户,system用户拥有dba,sysdba等角色或系统权限,system如果正常登录,它其实就是一个普通的dba用户,但是如果以as sysdba登录,其结果实际上它是作为sys用户登录的,这一点类似Linux里面的sudo的感觉,从登录信息里面我们可以看出来。sys用户必须以as sysdba或as sysoper形式登录。然后输入命令alter user scott account unlock;它的意思是将Scott用户解锁,以后关于dba的用到一个学一个,没必要从
5、头到尾的去学它。二SQL语言是在数据库下进行操作的语言,它本身是一个标准语言,有国际标准。有两套一个是SQL1992,SQL1999。大多数数据库既支持旧的标准也支持新的,很多也是用的旧的SQL语言写程序的,对于我们来说新旧都要学,而且对大多数数据库系统来说都是通用的,只不过不同数据库有一个轻微的改变,这就是最郁闷的地方,没方法到时候查手册或google一下。SQL全称为Structured Query Language,即机构化查询语言,它被定义为第四代语言。为什么叫第四代语言,因为我们知道第三代语言也得有if else for 等这些流程控制语句,也就是你得告诉它干什么且怎么干。第四大只用
6、告诉它我要干什么,不用去控制它怎么干,这样的语言学起来当然十分easy。我们共有四类语句要学:数据操作语言语句Data manipulation language,DML,会话控制语句 HYPERLINK :/whatis.ctocio /searchwhatis/18/5949018.shtml t _bank session control statement,数据定义语言语句Data definition language,DDL以及事务控制语句 HYPERLINK :/whatis.ctocio /searchwhatis/297/6092797.shtml t _bank trans
7、action control statement。查询语句只有一句话就是select语句,这是最重要的一条语句。以后只要遇到相应的select语句一律背过,企业再面试时其他语句一般不会怎么考但这条语句是必考的。如果考你SQL语句肯定会考这条select语句不是别的。你跟别人交流的时候,别说我写过几条dml语句,而因详细的说到底是什么语句,比方insert语句、update语句等。选择的意思是从表里把数据拿出来,展现出来。听起来似乎挺简单的,但你要从表里拿数据得首先知道有几张表,每张表里有些什么内容。第一步要做的就是熟悉一下实验用的数据,这些数据Oracle都给自带了,直接用就行了。首先第一条语
8、句desc emp,描述一下emp这张表,会分别列出所有字段表头,empno 雇员编号,ename 雇员名字,job 雇员工种,mgr 经理人,hiredate 雇员入职日期,sal 薪水,comm 津贴,奖金,deptno 所属部门编号。表还有一局部叫类型,也就是相对应字段的类型,这些都是Oracle已经定义好的,我们直接用。现在先用别人建立好的表,然后再自己建表。NUMBER指数字,VARCHAR指字符型,Oracle7以前在用,现在常用的是VARCHAR2它支持各种可变字符串,可以更好的表示各国文字,DATE指日期,NUMBER7,2指七位数字有两位小数。desc dept 部门表,它有
9、三个字段DEPTNO 部门编号,DNAME 部门名称,LOC部门所在位置。Desc salgrade工资等级表,许多公司都实行的是工资等级制,分几级工资,GRADE工资等级,HISAL该等级最高工资,LOSAL该等级最低工资。以上简要的介绍了三张表,如果想更详细的了解里面的数据,教大家第一个select语句:seclect * from 表名;。*表示把表里所有的数据都取出来,分号表示语句结束。尽量多熟悉各张表之间的关系,以及表内部各字段之间的关系,越熟悉越好。如果要算纯数据,可以采用dual这张表,它就一条记录,一个字段。你如果用其他表计算的话会有好多条重复结果,记录。字段是不能有空格的,如
10、果非要空格可以将整个字段用双引号括起来,这样的话引号里面就可以加上各种各样的字符了。如果没加引号的话那样做是不对的。再没有加双引号的时候结果字段名会以大写字母显示出来,但加了双引号就保持住了原来的形式不变。没有就是null值,即便是0也与空值大不一样。0是有值但为0,null是没有值。任何含有空值的表达式最后的结果都是空值。SQL里面有一个字符串链接符|,它的作用跟Java里的+一样,所有被链接的都会转换为字符串显示出来。如select ename|sal from emp;它的意思是将结果sal转换为字符串后链接到ename后面。在任何数据库的SQL语句里面都是用单引号括起来表示一个字符串序
11、列。如果字符串里本来就有单引号,再解析时就会出错。可以用两个单引号来代替一个单引号,这样就可以正确显示了。关键字distinct是指选择不重复的记录,如果修饰多个字段时表示选择该多个字段的组合不重复的显示出来。where叫过滤条件,它会过滤掉一些记录,等值判断用=,不等值判断注意是而不是Java语句里的不等号。字符串比较是比较字符的ASCII码,挨个比较。做比较时还可以用关键字between and,注意的是包括边界值的。and也可把两个过滤条件连接起来。下面来讲空值的处理,你可以直接用where +字段+is null来取出是空值的,取出不是空值的多加一个not就行。这种处理方式非常像我们的
12、说话习惯。in然后跟着某个字段的取值是括号括起来各值之间用逗号隔开。可以使用and、or,not连接起各个查询条件。日期处理起来稍微麻烦一些,由于现在还没有学日期函数,所以采用另外一种方式一个特殊的字符串。你就按它的日期写法来写如20-2月-07,然后系统就按照字符串来比较即可。年份可以写全如20-2月-2007,它能认出来。以后我们可以写成任何形式的日期格式都能处理。模糊查询是这样的,比方找知名字里含有al的,有点像正那么表达式。使用关键字like,可以通配符%,代表0个或多个字符,_代表一个字母。如果名字里就含有一个%,那么使用转义字符%的形式,当然可以自己指定转义字符方法是select
13、* from emp where ename like _A$% escape $;。排序用到的一个关键字是order by,默认的是按升序排列,如果想降序排列可以采用如下形式:select * from dept order by deptno desc;desc是降序的英文缩写。升序排列可不写也可加上asc。还可以参加where先过滤了再排序,按照几个字段进行排序时,用逗号分隔开,如下:select ename ,job,empno,sal ,deptno from emp order by deptno,sal desc;意思是先将表按照deptno升序排列,然后相同的deptno内部再
14、按照sal降序排列。三SQL函数,函数就是Java里的方法,有参数有返回值。现在讲的是单行函数,第一个叫做lower,作用是转换为小写;第二个叫upper,作用是转为大写;第三个叫substring,取子串。这几个函数都是对字符串进行操作的,传递进去的参数就是字段名。如select lowerename from emp;还有一个函数叫chr,它是把一个数字转为字符:select chr86 from dual;将86代表的字符显示出来,与之对应的是将一个字符转为对应的ASCII码,叫ascii,如:select asciiA from dual;就是将A的码值显示出来。round函数是四舍五
15、入的作用,如select round43.535435 from dual;结果就为44。还有一个重载的带两个参数的方法如select round43.535435,4 from dual;四舍五入到小数点后4位,结果位44.5354,第二个参数可以是负数表示四舍五入到小数点前多少位。其他函数可以不用记住,但要知道有这么个函数,然后取手册中可以查到,但下面讲的一个函数最好记住它。to_char是将字段内容显示为字符,可以对显示的形式进行格式控制,比方select to_charsal, $99,999,999.9999 from emp;就是以后面给定字符形式显示出来,小数点后的四位会强制显示
16、,而前面的没有的位数就不显示,这就是9的含义。$换为L表示本地货币。0代表一位数字,如果没有该位数字也会强制显示为0,对于这种方式是为了进行格式控制。实际上用to_char来控制数字是比较少用的,而用得最多的是对日期格式的控制,我们知道Oracle里的sysdate包含了插入记录的详细时间信息,我们可以对其进行显示的格式进行控制,比方:select to_charhiredate,yyyy-mm-dd from emp;转换为年月日20*-3-23这种格式的。实际上对日期的格式控制是利用Java来实现的,到时会有一个关于日期处理的专题。select ename,job,hiredate fro
17、m emp where hiredate to_date1982-1-1 1:30:00, yyyy-mm-dd hh:mi:ss;意思是将特定的字符串转换为相应的日期格式。还有to_number是将特定的字符串解析为相应的数字格式如select ename ,job ,sal from emp where sal2000;首先按deptno求出每个deptno的平均sal,然后对这些分组利用having 语句进行过滤。到现在为止已经学完了所有的单条select语句,执行顺序按照select+字段或内容+from+表名+where+group by+having+order by这个顺序进行执
18、行,首先取出记录,然后对单个记录进行过滤,过滤完了分组,分组好了对组过滤,剩下的分组再按顺序显示出来。单条select语句一定要非常熟悉,如果这都要查书的话对企业就没法交代了,哈哈!之前已经讲过一个子查询的例子:select ename,sal from emp where sal=select maxsal from emp;看谁的工资最高,之所以叫子查询因为再一个select语句里套了另外一个select语句。理解子查询的关键是把它当成一张表,可以对它做表连接最后就可以求出想要的结果来。单独的select语句相当简单,但是有了select子句和表连接之后语句就稍微复杂了点。select e
19、name ,sal from emp joinselect maxsal max_sal,deptno from emp group by deptno t on emp.sal=t.max_sal and t.deptno=emp.deptno;这个语句的作用是求出每个部门薪水最高的员工记录。select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;对于在同一张表中进行查询时需要进行自连接,为表取别名便于写出条件和比较。这条语句的意思是找出每个员工的经理人。为同一张表起不同的别名然后当成两张表来用。在SQL99里面链接
20、条件和过滤条件是分开的,即链接条件不能出现在where语句里面,利用Join+表名+on+链接条件进行。比方:select ename ,job,dname from emp join dept on emp.deptno=dept.deptno;等值链接的时候有一个简便的写法usingdeptno代替on emp.deptno=dept.deptno但不推荐使用,因它的限制条件很多,可能报出来的错误很难找并且看起来也不是很清楚。连接有各种各样的形式,下面我们讲外连接,其实用起来特别方便。它会把左边那张表不能和右边链接的数据也拿出来。select t1.ename , t2.ename mgr
21、 , t1.deptno from emp t1 left outer join emp t2 on t1.mgr=t2.empno;outer可以省略掉效果一样。如果想把右边多余的拿出来Join前加上right即可;如果两边多余的都想拿出来Join前加上full叫全外连接。讲一道面试题,不准用组函数求出薪水的最高值。方法是用自连接,连接条件采用非等值连接,这样表中的最大值就会连接不上,然后再从emp表中找出未连接上的最大值,如下:select sal from emp where sal not in select t1.sal from emp t1 join emp t2 on t1.s
22、alselect maxsal from emp where empno not in select distinct mgr from emp where mgr is not null and empno in select distinct mgr from emp where mgr is not null ;再讲一道面试题:比较这两个语句的执行效率Select * from emp where deptno=10 and ename like %A%;Select * from emp where ename like %A% and deptno=10;理论上说应该是第一个,就如同
23、&和&的区别一样它会过滤掉很多条件,后面的字符串就不用再取去比较了,但实际中不好说因为有可能Oracle在执行的时候做了优化,自动将数字比较放前面了。四现在已经讲完了select语句,接下来讲dml语句,常见的有三条,他们和select语句合称为数据库的四大语句select/insert/update/delete。增删改查!接下来简单介绍一下Oracle的逻辑结构。安装的时候创立了一个全局数据库,同时为这个数据库建立了一系列管理它的进程SID。一个大数据库里面又区分为不同的表空间,说白了就是装表的地儿。我们现在的表是放在不同的表空间里面,比方说users表空间,在里面放着某个用户所有的表,当
24、该用户登录进去后其实是去访问自己的表空间里的相对应的表。可以将某个表空间里的内容全部copy出去创立一个新的user,然后该user就操作专属于自己的表空间里的表了,所以说Oracle是支持多用户的。将某个表空间里的内容全部copy出去创立一个新的user做法是这样的:1.以超级管理员登录数据库conn sys/oracle as sysdba; 2.从命令行在起一个client,先建立一个目录如C:test进入该目录后执行del *.*删除所有,然后键入命令exp后提示输入用户名和口令,就是你要备份哪个就输哪个,接下来提示输入数组提取缓冲区大小,这个没关系内存里的一个小区域填满了再统一拿到硬
25、盘上来一路回车就行,等着它导完就可以了;3.创立新用户create user huanggang identified by haha0832 default tablespace users quota 10M on users;用户名huanggang口令haha0832在users表空间里分配10M的默认表空间给该用户;4.给予相应权限grant create session,create table,create view to huanggang,如果没有session它登录都是问题;5.导入文件imp后回车几个后提示是否导入整个导出文件选否后输入想导入的那个用户数据的用户名。只有2
26、和5是在命令行中完成,其余是超级用户登录后在数据库里完成。insert into+表名+values各字段值,在对这些数据进行操作时最好有一个备份,方法很简单rollback回退操作,create table 表名 as select * from +欲备份表名;insert语句还有一种插入方法,insert into dept2deptno,loc values50,beijing;只是插入局部字段的值,其他字段的值为null,还有一种方法是insert into dept2 select * from dept;将select子句选出的记录挨个插入前提是选出的记录与该表的记录格式相同。在O
27、racle中取完相应字段后,会在末尾附加一个伪字段,你看不到,叫做rownum,它是记录下每条记录在第几行了,用它的时候有个限制条件只能与或=6 and r=10;这个在Oracle里面是效率最高的,如果通过连接数据库用Java编程来做,但效率相当低。这个重点掌握,比方说显示论坛里的帖子是分页显示的,如果想显示第4页的内容一定是从某一个帖子到某一个帖子显示出来,帖子这个记录是按照发帖时间倒序排列的。三层嵌套就是Oracle对这种问题的解决方案,当然每一种数据库有自己的解决方式。SQL面试题:有3个表S,C,SC。SSNO,SNAME代表学号,姓名;CCNO,CNAME,CTEACHER代表课号
28、,课名,教师;SCSNO,CNO,SCGRADE代表学号,课程成绩。问题:找出没选过“黎明老师课程的所有学生姓名;列出2门以上含2门不及格学生姓名及平均成绩;既学过1号课程又学过2号课程所有学生姓名。请用标准SQL语言写出答案,方言也行请说明使用什么方言。select sname from s join sc on s.sno=sc.sno join c on c o=sc.no where c.cteacher liming; 2 select sname from s where sno in select sno from sc where scgrade =2; 3 select sn
29、ame from s where sno in select sno from sc where cno=1 and sno = select sno from sc where cno=2;update 的作用相对于对记录进行修改。用法是update+表名+set+字段列表及更新值过滤条件;delete+from+表名+过滤条件,删除某些字段。五接下来讲数据定义语言ddl语言。它实现了数据表,视图等的建立。事务transaction就是一系列的操作,要么同时完成要么不完成,比方转账操作要对两个账户update,不会出现数据不一致。对于Oracle来说,一个transcation起始于一条dm
30、l语句,然后一系列的操作rollback回退事务会结束;或commit结束事务,再rollback也没用;当遇到一条dcl语句或ddl语句提交结束事务;当正常退出exit时提交结束事务,不正常退出时如断电自动回滚结束事务。数据库常用对象是指它经常使用的一些资源,比方说表、视图或其他资源。下面讲如何创立一张表,create table +表名+字段及字段的数据类型。Oracle常用的数据类型有变长字符串varchar2最长字符数即上界4k、定长字符串char所占大小。有了变长字符串后为什么还要有定长字符串呢?主要还是效率问题,跟数组很像,但是站空间,很多结构、算法都存在拿空间换时间问题,如Has
31、hTable。数字型numberm,nm指总共多少为,n是小数点后的位数;日期date,包含年月日时分秒;变长字符串long可达2G,主要是有些时候一篇文本相当长;存图片可以把硬盘上图像的名字存到数据库里,也可以把整张图片存到数据库里。创立一张表存放学生数据如:create table stu id number8, name varchar20, sex number10, age number3, sdate date, grade number2 default 1, class number2, email varchar250 ;sex取数字来表示更节省空间,入学时日期加个s防止和关
32、键字冲突,可以为某些字段指定默认值当插入记录时没有对该字段赋新值就以该默认值,其他没有默认值为null。五个约束条件第一个叫非空,第二个叫唯一,第三个叫主键,第四个叫外键第五个叫check。当我们创立这张表的时候,有一个最简单的条件字段非空not null。在Oracle里面约束条件也可以看成一个对象,能为之取一个名字,加一个关键字constraint+约束名,如name varchar2 constraint stu_name_nn not null,不起时系统自动起名字我们不用管了。唯一约束的意思是在这个字段里面所有的记录不能重复,如id number8 unique,这属于字段级的约束;
33、字段级的约束有些限制,比方要某些字段组合不能重复,还有就是两个空值它不认为是重复的。要到达表级约束方法是在最后一个字段写完后加一句如:constraint stu_name_email_uniuniqueemail,name。主键primary key是可以唯一标示整条记录的东西,它代表的意思是既不能为空又不能重复,比方学生学号。E-mail做主键不好因为它可以为null,同时索引的时候数字比字符串效率高。如id number8 primary key ,也可以加在表级,如constraint stu_id_pk primary keyid,主键也可以是多个字段组合。外键约束建立在一张表的两个
34、字段上或者是两张表的两个字段上,是比较麻烦的一种约束。在emp和dept就有外键约束,往emp里加记录的时候不允许再dept里没有的部门编号。class number2 references classid,参考class这张表的id字段,当然也可以加在表级上:constraint foreign key class references classid,。注意在写外键约束的时候,stu里的class叫参考字段,class里的id叫被参考字段,加外键的前提是被参考字段必须是主键。删一条记录的时候首先看有没有其他字段参考它,有的话是无法删除的,违反了完整约束条件。Check约束用得比较少,在写m
35、is系统时数据在Java程序里就已经校验过了。修改表结构是在现有表上修改。在任何工程开发时候建表的SQL语句是要保存下来的,所以可以将表整个删掉再建。添加字段alter table +表名+add字段名+数据类型如alter table dept2 adddphone varchar211;删除某个字段如alter table dept2 dropdphone;还可以修改字段的数据类型,如果里面已经有数据修改的后果应不影响原来存的记录值。在Oracle里面看当前用户下有哪些表,哪些约束,哪些视图等等这些信息被单独地装在一张表里面,称作数据字典表。user_tables里面装的是当前用户共有多少
36、张表,里面字段可多了,我们关心的是table_name。查询当前用户下有哪些视图:select view_name from user_views;查询当前用户下有哪些表:select table_name from user_tables;查询当前用户下有哪些约束:select constraint_name,table_name from user_constraints;。user_tables、user_constraints、user_views这些都是数据字典表,那么一共有多少个数据字典表呢?Oracle专门有另外一张表存放数据字典表的表叫做dictionary,它总共两个字段一个
37、叫table_name数据字典表的名字、还有一个叫comments对于这张数据字典表的描述。总共有600多个数据字典表,这就是Oracle的DBA总是背着个小本本的原因,你要背是不可能的。索引就相当于字典里的索引一样,它在Oracle里相当于一种新的数据库对象,建立索引的方法create index idx_stu_emil on stu email;也可以在字段组合上建立索引,以后在查询组合时效率就高,删除索引同删除表方法类似。忘了自己有哪些索引可以采用select index_name from user_indexse;当你给某张表的字段加主键或唯一性约束的时候。建立索引的用处是当你建立
38、了索引后取访问相应数据的时候效率会很高。注意说的是读的效率高了,但存的效率反而低了,因为你得同时往索引表里加索引值,会占用大量的空间。记住一点不要轻易建立索引,除非觉得访问量特别大时。视图前面也提过,它是一张虚表,严格来讲就是一个子查询。利用它可以简化我们的查询复杂度,同时它也有不好的地方,就是表结构改了它也得跟着改动,增加了维护的难度。视图有些其他功能,比方说我有一个数据库,它里面存了所有的产品信息,而有一个供给商他想看我产品的信息,如果我把整张表都给他看那么关键信息他就全部都看走了,我的销量有多少等等。我可以建立一个视图里面只包含我想要给他看的内容。序列是Oracle数据库独有的东西,它产
39、生一个唯一、不间断的序列,作用是一般做主键。如下我们要存储BBS里的帖子建立一张表:create table article id number,title varchar21024,cont long;如果要参加一篇文章,采用这种做法select maxid from article;然后知道了id往里插,但假设有另外一个客户端在做数据插入同时也在执行完上面一条语句插入了一条记录就会导致数据不一致的现象。为此我们可以创立一个sequence,每次插的时候访问它的一个属性nextval就会得到不重复的id,实际上它是在内部做了同步的。六范式就是数据库设计的一些规那么,而它又是由一个姓范的提出的
40、。讲到设计其实是很复杂的事情,不能指望用几条规那么把所有的都总结出来你在造永动机,追求银弹silver bullet,所以有时要具体问题具体分析,该打破三范式的时候还是要敢于打破。三范式追求的是这样的目标:不存在冗余数据,换句话说就是同样的数据不存第二遍。当然除了冗余性外还有一些边缘性的要求,不是很重要,讲到的时候再说。第一范式的第一个要求-要有主键;第二个要求-列不可分,不能说姓名我还要分成姓和名。第二范式当一张表里有多个字段作为组合主键的时候,非主键的字段不能够依赖于局部主键,多对多关系的表应分割成三张表,如前一个面试题。第三范式是不能存在传递依赖,即除了主键之外的其他字段必须直接依赖于主
41、键。比方emp表里的deptno依赖于empno,而loc依赖于empno所以不能放一张表里。七PL_SQL是Oracle里面的一个编程语言,比较有用,在Oracle内部写一些存储过程,触发器,函数。根本上每一种数据库都有这么一个语言,SQL-Server叫做T_SQL,如果每个都学比较累,但是可以取学一种然后其他实在要用时再查上手要快很多。可能以后我们接触的写存储过程时机很少,实际上我们用SQL和Java程序就可以解决大局部问题了,这只是让大家有个了解知道有这么回事。PL语言用来补充SQL语言的,因为后者不带有分支和循环,对于有些问题求解不便,而过程语言可以解决。PL_SQL写程序非常固定,
42、分为四块,第一块叫declare,声明各种变量和游标的地方,可选;第二个叫begin,就是说程序从这开始执行了;exception是catch到任何异常时要执行的;end是结束,后面得有一个分号。set serveroutput on;begin dbms_output.put_linehi,pl_sql!;end;/第一句是将内部环境变量翻开,默认的是关掉的,不然看不到任何输出结果。dbms_output相当于system.out而put_line相当于println。declare v_name varchar220;begin v_name := huanggang; dbms_outp
43、ut.put_linev_name;end;/变量名的写法是v_+名字,声明的时候是变量名在前,类型在后;赋值语句有点像pascal冒号等号;declare v_name number := 0; begin v_name := 2/v_name; dbms_output.put_linev_name; exception when others then dbms_output.put_lineError!; end; /当检测到异常时才执行exception,when others then 这样做就相当于一张大网子,肯定能把异常捕获到。PL_SQL变量声明规那么:变量名不能够使用保存字O
44、racle里保存字很多所以推荐使用v_+名字,这样不易冲突,如select、from等;第一个字符必须是字母;变量名最多包含30个字符;不要与数据库的表或者列同名;每一行只能声明一个变量。常用变量类型7种:binary_integer整数主要是计数而不是用来表示字段类型用来for循环,数组下标,效率比较高,Oracle追求的目标;number数字类型;char定长字符串;date日期;long长字符串可达2GB;boolean布尔可取true、false或null值,建议大家布尔类型在用的时候一定要给一个初值,否那么是null。declare v_temp number1; v_count b
45、inary_integer :=0; v_sal number7,2 := 4000.00; v_date date := sysdate; v_pi constant number := 3.14; v_valid boolean := false; v_name varchar220 not null :=myName; begin dbms_output.put_linev_temp value:|v_date; end; /dbms_output.put_line不能打印处布尔类型的值。Constant相当于Java的final ,not null对变量进行限制。Oracle里面的变量
46、经常用来存储某一张表的某个字段的值,使用%type属性为了解决表里字段的变动与声明变量类型一致。在PL_SQL里面可以使用 两个短横线注释掉一行,注释掉多行的时候用/* */。declare v_empno number4; v_empno2 emp.empno%type; v_empno3 v_empno2%type; begin dbms_output.put_lineTest; end;%type可以看做变量的一个属性,指示其类型;引用某张表某个字段方法如v_empno2 emp.empno%type;。下面接着讲PL_SQL里面复杂的变量,可以定义复合变量,有两种:Table相当于Ja
47、va里的数组;Record相当于Java里的类,暂且这样理解。要指定table的数据类型,比较复杂是这样来做type type_table_emp_empno is table of emp.empno%type index by binary_integer;type定义了一种新的数据类型名字叫type_table_emp_empno,然后可以用它定义新变量如 v_empnos type_table_emp_empno;。比较有意思的是下标可以取负值如v_empnos-1。是什么促使了record类型数据的出现呢?我们现在写的是PL_SQL,它最主要用于操纵表,表里面有字段、记录,如果把一条
48、记录放一个变量里以后用起来要方便得多。声明这种类型的方式如:declare type type_record_dept is record deptno dept.deptno%type, dname dept.dname%type, loc dept.loc%type; v_temp type_record_dept;begin v_temp.deptno := 50; v_temp.dname := aaaa; v_temp.loc := bj; dbms_output.put_linev_temp.deptno| | v_temp.dname;end;/这样声明还有一个弊病,那就是当字段
49、改变时控制起来比较烦人,为此引入rowtype属性来声明record变量。只需:declare v_temp dept%rowtype;begin v_temp.deptno := 50; v_temp.dname := aaaa; v_temp.loc := bj; dbms_output.put_linev_temp.deptno| | v_temp.dname;end;/PL_SQL语句里的select语句只能返回一条记录,且select语句里面必须有个into或使用游标,还要保证有且仅有一条记录被返回,这是它比较特别的地方,不然会报错。在PL_SQL里面使用insert、delete、
50、update后加上commit不然起不了作用有时,只不过。同时还有这么一个需求-执行上述语句以后有多少条记录受影响除select,对它来说没多大意义,这样做:dbms_output.put_linesql%rowcount|条记录受影响;sql代表刚刚执行完的sql语句,而rowcount代表刚刚执行完的sql语句影响了多少条记录。如果在PL_SQL里创立一张表得这样写:execute immediate create table Tnnn varchar220 default aaa; 由于外面已经有单引号了所以里面的一个单引号得用两个代表一个。default是给一个默认值。PL_SQL里条
51、件语句是形如if 条件 then elsif 条件 then else end if;注意最后一个else后没有then,其他条件后有,而且elsif没有那个e,最后以end if;结束。PL_SQL里也有三种循环,首先看第一种,如下:declare i binary_integer :=0;begin loopdbms_output.put_linei;i:= i+1;exit when i=11; end loop;end;这也类似于Java里的do -while循环;第二种,如下:declare j binary_integer :=1;begin while j11 loopdbms_
52、output.put_linej;j := j+1; end loop;end;这也类似于Java里的while循环;第三种,如下:begin begin for k in 1.10 loop dbms_output.put_linek; end loop; for k in reverse 1.10 loop dbms_output.put_linek; end loop;end;这类似于Java里的for循环,reverse表示逆序循环,1.10指定循环范围。PL_SQL里也可以逮某种类型的错误,Java里每一种exception都有相应的类为代表,同理PL_SQL里也一样,如no_dat
53、a_found/too_many_rows,学语言得学会类比。下面举个例子给大家看一下,本来错误处理也不是我们的重点。declare v_temp emp.empno%type;begin select empno into v_temp from emp where deptno=10; dbms_output.put_linev_temp;exception when too_many_rows then dbms_output.put_line选定行数过多!; when others then dbms_output.put_lineerror;end;PL_SQL的程序大概也是只有在写
54、计费的时候或对某些工程有特殊要求的时候,比方效率。否那么我们写的都是跨数据库平台的程序。下面学习一下作为dba记录错误常用的一种方法:首先创立一张表叫errorlog记录错误信息。creat table errorlog id number primary key, errcode number, errmsg varchar21024, errdate date;然后id是自动递增的,采用序列:create sequence seq_errlog_id start with 1 increment by 1;在exception里捕获:exception when others then r
55、ollback; v_errcode := SQLCODE; v_errmsg := SQLERRM; insert into errorlog values seq_errorlog_id.nexval,v_errcode,v_errmsg,sysdate;commit;PL_SQL的重点-游标。Select语句执行完后会返回一个结果集,游标就是最顶上那个指针,指向结果集的第一条记录,与迭代器差不多。声明游标的时候并不会去数据库里取数据只有翻开的时候,结果集才会放到内存中,关于游标有四个属性:isopen用得不多,notfound最近的一条fetch没有返回记录时返回true,found找着
56、了返回true,rowcount当前已经fetch了多少条记录。declare cursor c is select * from emp; v_temp c%rowtype;begin open c; loop fetch c into v_temp; exit when c%notfound; dbms_output.put_linev_temp.ename; end loop; close c;end;注意循环里的三条语句是不能颠倒位置的,比方后两条一颠倒的话就会出现最后一条记录打印两次,而实际上最后是没找到的,结果明显不对。declare cursor c is select * fr
57、om emp;begin for v_temp in c loop dbms_output.put_linev_temp.ename; end loop;end;这是使用for循环和游标使用的情形,明显简单不用去管哪些细节比方是否found,open且不易出错,平时常用。declare cursor cv_deptno emp.deptno%type, v_job emp.job%type is select ename,sal from emp where v_deptno=deptno and v_job=job;begin for v_temp in c30,CLERK loop dbm
58、s_output.put_linev_temp.ename; end loop;end;这是带参数的游标使用方法。declare cursor c is select * from emp2 for update;begin for v_temp in c loop if v_temp.salv_b then v_ret := v_a; else v_ret := v_b; end if; v_temp := v_temp+1;end;in 表示传入参数,不写默认为传入参数,out表传出参数,in out表既是传入又是传出参数。调用时采取这种方式:declare v_a number :=3;
59、 v_b number :=4; v_ret number; v_temp number :=5;begin pv_a, v_b, v_ret, v_temp; dbms_output.put_linev_ret; dbms_output.put_linev_temp;end;/注意即便是你这过程有错误同样会被创立,为了展现出错的地方可以敲入命令:show error;。编写函数是用得不太多的,我们可以了解一下,原来那些函数能用在什么地方,你写的一样可以。形如:create or replace function sal_tax v_sal number return number is be
60、gin if v_sal2000 then return 0.1; elsif v_sal2750 then return 0.15; else return 0.2; end if; end;调用方法如:select lowerename, sal_taxsal from emp;触发器是一个比较重要的概念,具体的写法忘记了回头要写的时候很简单,回来查就可以了。比方谁对银行账户进行了转账等操作,一定得记录下来。先创立一张表:create table emp2_loguname varchar220, action varchar210, udate date;然后创立触发器:create o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考总复习英语(人教版)教师用书写作提升02体裁篇第1讲第2节演讲稿
- 一年级体育下册教案
- 小学安全教育教案 全
- KH550的水解工艺及其对表面改性的研究
- 2023-2024学年全国小学四年级上信息与技术人教版模拟考卷(含答案解析)
- 2024年江西客运资格证急救试题答案
- 2024年少儿终身保障保险合同样本
- 即食型金针菇产品加工产业园项目可行性研究报告
- 2024年铜川小型客运从业资格证考试真题保过
- 2024年拉萨驾驶员客运从业资格证模拟考试题答案
- 化工和危险化学品企业重大事故隐患重点排查事项清单(参考模板)
- 《盘古开天地作业设计方案-2023-2024学年语文统编版》
- 学校食堂老鼠风险日管控参考清单、控制效果评估C级标准
- (正式版)SHT 3075-2024 石油化工钢制压力容器材料选用规范
- 高层建筑施工-形考作业3(第5-9章权重40%)-国开(HB)-参考资料
- 医美面诊技巧培训课件
- 2024年上海公安机关辅警招聘笔试参考题库附带答案详解
- 2024年中国诗词大会知识竞赛模拟题库及答案(120题)
- 细胞分裂产生新细胞说课
- 人教版小学数学六年级上册第四单元《比》单元作业设计
- 临床医学检验:血栓与止血检验考试题库(题库版)
评论
0/150
提交评论