Oracle经典自学笔记_第1页
Oracle经典自学笔记_第2页
Oracle经典自学笔记_第3页
Oracle经典自学笔记_第4页
Oracle经典自学笔记_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

1、一验证Oracle差不多安装完成了,首先得确认程序里有这些个选项,有四个选项:Oracle Installation Products、集成治理工具、配置和移植工具(治理员用得比较多)、应用程序开发。Oracle也能够形成一种层次性的链接(Directory Manager),关于我们来讲用得最多是sqlplus,而OLE 是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM),他是微软提出的,在用VB开发时可能要用,关于我们来讲不须管。当启动sqlplus时会提示输入用户名和口令,所谓的sqlplus是Oracle的一个客户端。Oracle大多数命令都用命令来实现,因此比较难

2、使,就如同unix比windows难使。口令你输入tiger,建议就用它,因为以后去企业里Oracle 9i确实是用的那个口令。当你看到SQL命令符时讲明差不多进入到了Oracle的命令行了。图形版的sqlplus,命令行的sqlplus,还有一个确实是通过网页访问Oracle的服务,启动sqlplus,端口号是5560,URL是 HYPERLINK :5560/isqlplus。isqlplus :5560/isqlplus。isqlplus特不有用,比如讲你的机器上没有装上Oracle,就能够通过键入不人的IP,然后登陆到他的机器上来做实验,因此也能够安装特定的客户端软件实现。讲实在的Or

3、acle的那个客户端太难看了,同时要记好多好多的命令,因此专门有一类公司专门为Oracle开发客户端。有一个比较闻名的客户端叫Toad,因此Oracle还有一个客户端PL/SQL Develplor,那个用的也特不多。数据库治理时常用Toad(英文蛤蟆的意思),假如有声卡的话,你启动一次它就叫一次。对我们来讲sqlplus足够使了。以后有机会我使用一下PL/SQL Develplor,只是那个也不行使,因为你同时必须装上Oracle,还不如isqlplus好呢。以超级治理员身份链接数据库的方法是再命令行下敲入命令:sqlplus sys/口令 as sysdba。Sys和system的区不是s

4、ys是数据库治理者,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 /searchwhatis/18/5949018.shtml t _bank session control statement,数据定义语言语句Data definition language,DDL以及事务操纵语句 HYPERLINK /searchwhatis/297/6092797.shtml t _bank transaction control s

7、tatement。查询语句只有一句话确实是select语句,这是最重要的一条语句。以后只要遇到相应的select语句一律背过,企业再面试时其他语句一般可不能如何考但这条语句是必考的。假如考你SQL语句确信会考这条select语句不是不的。你跟不人交流的时候,不讲我写过几条dml语句,而因详细的讲到底是什么语句,比如insert语句、update语句等。选择的意思是从表里把数据拿出来,展现出来。听起来大概挺简单的,但你要从表里拿数据得首先明白有几张表,每张表里有些什么内容。第一步要做的确实是熟悉一下实验用的数据,这些数据Oracle都给自带了,直接用就行了。首先第一条语句desc emp,描述一

8、下emp这张表,会分不列出所有字段(表头),empno 雇员编号,ename 雇员名字,job 雇职员种,mgr 经理人,hiredate 雇员入职日期,sal 薪水,comm 津贴,奖金,deptno 所属部门编号。表还有一部分叫类型,也确实是相对应字段的类型,这些差不多上Oracle差不多定义好的,我们直接用。现在先用不人建立好的表,然后再自己建表。NUMBER指数字,VARCHAR指字符型,Oracle7往常在用,现在常用的是VARCHAR2它支持各种可变字符串,能够更好的表示各国文字,DATE指日期,NUMBER(7,2)指七位数字有两位小数。desc dept 部门表,它有三个字段D

9、EPTNO 部门编号,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 lower(ename) from emp;还有一个函数叫chr,它是把一个数字转为字符:select chr(86) from dual;将86代表的字符显示出来,与之对应的是将一个字符转为对应的ASCII码,叫ascii,如:select ascii(A) from dual;确实是将A的码值显示出来

15、。round函数是四舍五入的作用,如select round(43.535435) from dual;结果就为44。还有一个重载的带两个参数的方法如select round(43.535435,4) from dual;四舍五入到小数点后4位,结果位44.5354,第二个参数能够是负数表示四舍五入到小数点前多少位。其他函数能够不用记住,但要明白有这么个函数,然后取手册中能够查到,但下面讲的一个函数最好记住它。to_char是将字段内容显示为字符,能够对显示的形式进行格式操纵,比如select to_char(sal, $99,999,999.9999) from emp;确实是以后面给定字符

16、形式显示出来,小数点后的四位会强制显示,而前面的没有的位数就不显示,这确实是9的含义。$换为L表示本地货币。0代表一位数字,假如没有该位数字也会强制显示为0,关于这种方式是为了进行格式操纵。实际上用to_char来操纵数字是比较少用的,而用得最多的是对日期格式的操纵,我们明白Oracle里的sysdate包含了插入记录的详细时刻信息,我们能够对其进行显示的格式进行操纵,比如:select to_char(hiredate,yyyy-mm-dd) from emp;转换为年月日2006-3-23这种格式的。实际上对日期的格式操纵是利用Java来实现的,到时会有一个关于日期处理的专题。select

17、 ename,job,hiredate from emp where hiredate to_date(1982-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

18、 by+having+order by那个顺序进行执行,首先取出记录,然后对单个记录进行过滤,过滤完了分组,分组好了对组过滤,剩下的分组再按顺序显示出来。单条select语句一定要特不熟悉,假如这都要查书的话对企业就没法交代了,哈哈!之前差不多讲过一个子查询的例子:select ename,sal from emp where sal=(select max(sal) from emp);看谁的工资最高,之因此叫子查询因为再一个select语句里套了另外一个select语句。理解子查询的关键是把它当成一张表,能够对它做表连接最后就能够求出想要的结果来。单独的select语句相当简单,然而有了s

19、elect子句和表连接之后语句就略微复杂了点。select ename ,sal from emp join(select max(sal) 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;关于在同一张表中进行查询时需要进行自连接,为表取不名便于写出条件和比较。这条语句的意思是找出每个职

20、员的经理人。为同一张表起不同的不名然后当成两张表来用。在SQL99里面链接条件和过滤条件是分开的,即链接条件不能出现在where语句里面,利用Join+表名+on+链接条件进行。比如:select ename ,job,dname from emp join dept on (emp.deptno=dept.deptno);等值链接的时候有一个简便的写法using(deptno)代替on (emp.deptno=dept.deptno)但不推举使用,因它的限制条件专门多,可能报出来的错误专门难找同时看起来也不是专门清晰。连接有各种各样的形式,下面我们讲外连接,事实上用起来特不方便。它会把左边那

21、张表不能和右边链接的数据也拿出来。select t1.ename , t2.ename mgr , 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

22、 in (select t1.sal from emp t1 join emp t2 on (t1.sal(select max(sal) 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 *

23、from emp where ename like %A% and deptno=10;理论上讲应该是第一个,就如同&和&的区不一样它会过滤掉专门多条件,后面的字符串就不用再取去比较了,但实际中不行讲因为有可能Oracle在执行的时候做了优化,自动将数字比较放前面了。四现在差不多讲完了select语句,接下来讲dml语句,常见的有三条,他们和select语句合称为数据库的四大语句(select/insert/update/delete)。增删改查!接下来简单介绍一下Oracle的逻辑结构。安装的时候创建了一个全局数据库,同时为那个数据库建立了一系列治理它的进程SID。一个大数据库里面又区分为不

24、同的表空间,讲白了确实是装表的地儿。我们现在的表是放在不同的表空间里面,比方讲users表空间,在里面放着某个用户所有的表,当该用户登录到里面去后事实上是去访问自己的表空间里的相对应的表。能够将某个表空间里的内容全部copy出去创建一个新的user,然后该user就操作专属于自己的表空间里的表了,因此讲Oracle是支持多用户的。将某个表空间里的内容全部copy出去创建一个新的user做法是如此的:1.以超级治理员登录数据库conn sys/oracle as sysdba; 2.从命令行在起一个client,先建立一个目录如C:test进入该目录后执行del *.*删除所有,然后键入命令ex

25、p后提示输入用户名和口令,确实是你要备份哪个就输哪个,接下来提示输入数组提取缓冲区大小,那个没关系(内存里的一个小区域填满了再统一拿到硬盘上来)一路回车就行,等着它导完就能够了;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,

26、假如没有session它登录差不多上问题;5.导入文件imp后回车几个后提示是否导入整个导出文件选否后输入想导入的那个用户数据的用户名。只有2和5是在命令行中完成,其余是超级用户登录后在数据库里完成。insert into+表名+values(各字段值),在对这些数据进行操作时最好有一个备份,方法专门简单rollback回退操作,create table 表名 as select * from +欲备份表名;insert语句还有一种插入方法,insert into dept2(deptno,loc) values(50,beijing);只是插入部分字段的值,其他字段的值为null,还有一种方

27、法是insert into dept2 select * from dept;将select子句选出的记录挨个插入前提是选出的记录与该表的记录格式相同。在Oracle中取完相应字段后,会在末尾附加一个伪字段,你看不到,叫做rownum,它是记录下每条记录在第几行了,用它的时候有个限制条件只能与或=6 and r=10;那个在Oracle里面是效率最高的,假如通过连接数据库用Java编程来做,但效率相当低。那个重点掌握,比如讲显示论坛里的帖子是分页显示的,假如想显示第4页的内容一定是从某一个帖子到某一个帖子显示出来,帖子那个记录是按照发帖时刻倒序排列的。三层嵌套确实是Oracle对这种问题的解决

28、方案,因此每一种数据库有自己的解决方式。SQL面试题:有3个表S,C,SC。S(SNO,SNAME)代表(学号,姓名);C(CNO,CNAME,CTEACHER)代表(课号,课名,教师);SC(SNO,CNO,SCGRADE)代表(学号,课程成绩)。问题:找出没选过“拂晓”老师课程的所有学生姓名;列出2门以上(含2门)不及格学生姓名及平均成绩;既学过1号课程又学过2号课程所有学生姓名。请用标准SQL语言写出答案,方言也行(请讲明使用什么方言)。select sname from s join sc on (s.sno=sc.sno) join c on (o=sc.no) where c.ct

29、eacher liming; (2) select sname from s where sno in (select sno from sc where scgrade =2); (3) select sname 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语言。它实

30、现了数据表,视图等的建立。事务transaction确实是一系列的操作,要么同时完成要么不完成,比如转账操作要对两个账户update,可不能出现数据不一致。关于Oracle来讲,一个transcation起始于一条dml语句,然后一系列的操作rollback回退事务会结束;或commit结束事务,再rollback也没用;当遇到一条dcl语句或ddl语句提交结束事务;当正常退出exit时提交结束事务,不正常退出时(如断电)自动回滚结束事务。数据库常用对象是指它经常使用的一些资源,比方讲表、视图或其他资源。下面讲如何创建一张表,create table +表名+字段及字段的数据类型。Oracle

31、常用的数据类型有变长字符串varchar2(最长字符数即上界4k)、定长字符串char(所占大小)。有了变长字符串后什么缘故还要有定长字符串呢?要紧依旧效率问题,跟数组专门像,然而站空间,专门多结构、算法都存在拿空间换时刻问题,如HashTable。数字型number(m,n)m指总共多少为,n是小数点后的位数;日期date,包含年月日时分秒;变长字符串long可达2G,要紧是有些时候一篇文本相当长;存图片能够把硬盘上图像的名字存到数据库里,也能够把整张图片存到数据库里。创建一张表存放学生数据如:create table stu ( id number(8), name varchar(20)

32、, sex number(10), age number(3), sdate date, grade number(2) default 1, class number(2), email varchar2(50) );sex取数字来表示更节约空间,入学时日期加个s幸免和关键字冲突,能够为某些字段指定默认值当插入记录时没有对该字段赋新值就以该默认值,其他没有默认值为null。五个约束条件第一个叫非空,第二个叫唯一,第三个叫主键,第四个叫外键第五个叫check。当我们创建这张表的时候,有一个最简单的条件字段非空not null。在Oracle里面约束条件也能够看成一个对象,能为之取一个名字,加一

33、个关键字constraint+约束名,如name varchar(2) constraint stu_name_nn not null,不起时系统自动起名字我们不用管了。唯一约束的意思是在那个字段里面所有的记录不能重复,如id number(8) unique,这属于字段级的约束;字段级的约束有些限制,比如要某些字段组合不能重复,还有确实是两个空值它不认为是重复的。要达到表级约束方法是在最后一个字段写完后加一句如:constraint stu_name_email_uniunique(email,name)。主键(primary key)是能够唯一标示整条记录的东西,它代表的意思是既不能为空又

34、不能重复,比如学生学号。E-mail做主键不行因为它能够为null,同时索引的时候数字比字符串效率高。如id number(8) primary key ,也能够加在表级,如constraint stu_id_pk primary key(id),主键也能够是多个字段组合。外键约束建立在一张表的两个字段上或者是两张表的两个字段上,是比较苦恼的一种约束。在emp和dept就有外键约束,往emp里加记录的时候不同意再dept里没有的部门编号。class number(2) references class(id),参考class这张表的id字段,因此也能够加在表级上:constraint fore

35、ign key (class) references class(id),。注意在写外键约束的时候,stu里的class叫参考字段,class里的id叫被参考字段,加外键的前提是被参考字段必须是主键。删一条记录的时候首先看有没有其他字段参考它,有的话是无法删除的,违反了完整约束条件。Check约束用得比较少,在写mis系统时数据在Java程序里就差不多校验过了。修改表结构是在现有表上修改。在任何项目开发时候建表的SQL语句是要保存下来的,因此能够将表整个删掉再建。添加字段alter table +表名+add(字段名+数据类型)如alter table dept2 add(dphone var

36、char2(11);删除某个字段如alter table dept2 drop(dphone);还能够修改字段的数据类型,假如里面差不多有数据修改的后果应不阻碍原来存的记录值。在Oracle里面看当前用户下有哪些表,哪些约束,哪些视图等等这些信息被单独地装在一张表里面,称作数据字典表。user_tables里面装的是当前用户共有多少张表,里面字段可多了,我们关怀的是table_name。查询当前用户下有哪些视图:select view_name from user_views;查询当前用户下有哪些表:select table_name from user_tables;查询当前用户下有哪些约束

37、:select constraint_name,table_name from user_constraints;。user_tables、user_constraints、user_views这些差不多上数据字典表,那么一共有多少个数据字典表呢?Oracle专门有另外一张表存放数据字典表的表叫做dictionary,它总共两个字段一个叫table_name数据字典表的名字、还有一个叫comments关于这张数据字典表的描述。总共有600多个数据字典表,这确实是Oracle的DBA总是背着个小本本的缘故,你要背是不可能的。索引就相当于字典里的索引一样,它在Oracle里相当于一种新的数据库对象

38、,建立索引的方法create index idx_stu_emil on stu (email);也能够在字段组合上建立索引,以后在查询组合时效率就高,删除索引同删除表方法类似。忘了自己有哪些索引能够采纳select index_name from user_indexse;当你给某张表的字段加主键或唯一性约束的时候。建立索引的用处是当你建立了索引后取访问相应数据的时候效率会专门高。注意讲的是读的效率高了,但存的效率反而低了,因为你得同时往索引表里加索引值,会占用大量的空间。记住一点不要轻易建立索引,除非觉得访问量特不大时。视图前面也提过,它是一张虚表,严格来讲确实是一个子查询。利用它能够简化

39、我们的查询复杂度,同时它也有不行的地点,确实是表结构改了它也得跟着改动,增加了维护的难度。视图有些其他功能,比如讲我有一个数据库,它里面存了所有的产品信息,而有一个供应商他想看我产品的信息,假如我把整张表都给他看那么关键信息他就全部都看走了,我的销量有多少等等。我能够建立一个视图里面只包含我想要给他看的内容。序列是Oracle数据库独有的东西,它产生一个唯一、不间断的序列,作用是一般做主键。如下我们要存储BBS里的帖子建立一张表:create table article (id number,title varchar2(1024),cont long);假如要加入一篇文章,采纳这种做法sel

40、ect max(id) from article;然后明白了id往里插,但若有另外一个客户端在做数据插入同时也在执行完上面一条语句插入了一条记录就会导致数据不一致的现象。为此我们能够创建一个sequence,每次插的时候访问它的一个属性nextval就会得到不重复的id,实际上它是在内部做了同步的。六范式确实是数据库设计的一些规则,而它又是由一个姓范的提出的。讲到设计事实上是专门复杂的情况,不能希望用几条规则把所有的都总结出来(你在造永动机,追求银弹silver bullet),因此有时要具体问题具体分析,该打破三范式的时候依旧要敢于打破。三范式追求的是如此的目标:不存在冗余数据,换句话讲确实

41、是同样的数据不存第二遍。因此除了冗余性外还有一些边缘性的要求,不是专门重要,讲到的时候再讲。第一范式的第一个要求-要有主键;第二个要求-列不可分,不能讲姓名我还要分成姓和名。第二范式当一张表里有多个字段作为组合主键的时候,非主键的字段不能够依靠于部分主键,多对多关系的表应分割成三张表,如前一个面试题。第三范式是不能存在传递依靠,即除了主键之外的其他字段必须直接依靠于主键。比如emp表里的deptno依靠于empno,而loc依靠于empno因此不能放一张表里。七PL_SQL是Oracle里面的一个编程语言,比较有用,在Oracle内部写一些存储过程,触发器,函数。差不多上每一种数据库都有这么一

42、个语言,SQL-Server叫做T_SQL,假如每个都学比较累,然而能够取学一种然后其他实在要用时再查上手要快专门多。可能以后我们接触的写存储过程机会专门少,实际上我们用SQL和Java程序就能够解决大部分问题了,这只是让大伙儿有个了解明白有这么回事。PL语言用来补充SQL语言的,因为后者不带有分支和循环,关于有些问题求解不便,而过程语言能够解决。PL_SQL写程序特不固定,分为四块,第一块叫declare,声明各种变量和游标的地点,可选;第二个叫begin,确实是讲程序从这开始执行了;exception是catch到任何异常时要执行的;end是结束,后面得有一个分号。set serverou

43、tput on;begin dbms_output.put_line(hi,pl_sql!);end;/第一句是将内部环境变量打开,默认的是关掉的,不然看不到任何输出结果。dbms_output相当于system.out而put_line相当于println。declare v_name varchar2(20);begin v_name := huanggang; dbms_output.put_line(v_name);end;/变量名的写法是v_+名字,声明的时候是变量名在前,类型在后;赋值语句有点像pascal冒号等号;declare v_name number := 0; begin

44、 v_name := 2/v_name; dbms_output.put_line(v_name); exception when others then dbms_output.put_line(Error!); end; /当检测到异常时才执行exception,when others then 如此做就相当于一张大网子,确信能把异常捕获到。PL_SQL变量声明规则:变量名不能够使用保留字(Oracle里保留字专门多因此推举使用v_+名字,如此不易冲突),如select、from等;第一个字符必须是字母;变量名最多包含30个字符;不要与数据库的表或者列同名;每一行只能声明一个变量。常用变量

45、类型7种:binary_integer整数要紧是计数而不是用来表示字段类型(用来for循环,数组下标,效率比较高,Oracle追求的目标);number数字类型;char定长字符串;date日期;long长字符串可达2GB;boolean布尔可取true、false或null值,建议大伙儿布尔类型在用的时候一定要给一个初值,否则是null。declare v_temp number(1); v_count binary_integer :=0; v_sal number(7,2) := 4000.00; v_date date := sysdate; v_pi constant number

46、:= 3.14; v_valid boolean := false; v_name varchar2(20) not null :=myName; begin dbms_output.put_line(v_temp value:|v_date); end; /dbms_output.put_line不能打印处布尔类型的值。Constant相当于Java的final ,not null对变量进行限制。Oracle里面的变量经常用来存储某一张表的某个字段的值,使用%type属性为了解决表里字段的变动与声明变量类型一致。在PL_SQL里面能够使用 两个短横线注释掉一行,注释掉多行的时候用/* */。

47、declare v_empno number(4); v_empno2 emp.empno%type; v_empno3 v_empno2%type; begin dbms_output.put_line(Test); end;%type能够看做变量的一个属性,指示其类型;引用某张表某个字段方法如v_empno2 emp.empno%type;。下面接着讲PL_SQL里面复杂的变量,能够定义复合变量,有两种:Table相当于Java里的数组;Record相当于Java里的类,暂且如此理解。要指定table的数据类型,比较复杂是如此来做type type_table_emp_empno is t

48、able 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,它最要紧用于操纵表,表里面有字段、记录,假如把一条记录放一个变量里以后用起来要方便得多。声明这种类型的方式如:declare type type_record_dept is record( deptno dept

49、.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_line(v_temp.deptno| | v_temp.dname);end;/如此声明还有一个弊病,那确实是当字段改变时操纵起来比较烦人,为此引入rowtype属性来声明record变量。只需:declare v_temp dept%rowtype;begin v_t

50、emp.deptno := 50; v_temp.dname := aaaa; v_temp.loc := bj; dbms_output.put_line(v_temp.deptno| | v_temp.dname);end;/PL_SQL语句里的select语句只能返回一条记录,且select语句里面必须有个into或使用游标,还要保证有且仅有一条记录被返回,这是它比较特不的地点,不然会报错。在PL_SQL里面使用insert、delete、update后加上commit不然起不了作用有时,只只是。同时还有这么一个需求-执行上述语句以后有多少条记录受阻碍(除select,对它来讲没多大意义

51、),如此做:dbms_output.put_line(sql%rowcount|条记录受阻碍);sql代表刚刚执行完的sql语句,而rowcount代表刚刚执行完的sql语句阻碍了多少条记录。假如在PL_SQL里创建一张表得如此写:execute immediate create table T(nnn varchar2(20) default aaa); 由于不处差不多有单引号了因此里面的一个单引号得用两个代表一个。default是给一个默认值。PL_SQL里条件语句是形如if (条件) then elsif (条件) then else end if;注意最后一个else后没有then,其

52、他条件后有,而且elsif没有那个e,最后以end if;结束。PL_SQL里也有三种循环,首先看第一种,如下:declare i binary_integer :=0;begin loopdbms_output.put_line(i);i:= i+1;exit when (i=11); end loop;end;这也类似于Java里的do -while循环;第二种,如下:declare j binary_integer :=1;begin while j11 loopdbms_output.put_line(j);j := j+1; end loop;end;这也类似于Java里的while

53、循环;第三种,如下:begin begin for k in 1.10 loop dbms_output.put_line(k); end loop; for k in reverse 1.10 loop dbms_output.put_line(k); end loop;end;这类似于Java里的for循环,reverse表示逆序循环,1.10指定循环范围。PL_SQL里也能够逮某种类型的错误,Java里每一种exception都有相应的类为代表,同理PL_SQL里也一样,如no_data_found/too_many_rows,学语言得学会类比。下面举个例子给大伙儿看一下,本来错误处理也

54、不是我们的重点。declare v_temp emp.empno%type;begin select empno into v_temp from emp where deptno=10; dbms_output.put_line(v_temp);exception when too_many_rows then dbms_output.put_line(选定行数过多!); when others then dbms_output.put_line(error);end;PL_SQL的程序大概也是只有在写计费的时候或对某些项目有专门要求的时候,比如效率。否则我们写的差不多上跨数据库平台的程序。

55、下面学习一下作为dba记录错误常用的一种方法:首先创建一张表叫errorlog记录错误信息。creat table errorlog( id number primary key, errcode number, errmsg varchar2(1024), errdate date);然后id是自动递增的,采纳序列:create sequence seq_errlog_id start with 1 increment by 1;在exception里捕获:exception when others then rollback; v_errcode := SQLCODE; v_errmsg

56、:= SQLERRM; insert into errorlog values (seq_errorlog_id.nexval,v_errcode,v_errmsg,sysdate);commit;PL_SQL的重点-游标。Select语句执行完后会返回一个结果集,游标确实是最顶上那个指针,指向结果集的第一条记录,与迭代器差不多。声明游标的时候并可不能去数据库里取数据只有打开的时候,结果集才会放到内存中,关于游标有四个属性:isopen用得不多,notfound最近的一条fetch没有返回记录时返回true,found找着了返回true,rowcount当前差不多fetch了多少条记录。dec

57、lare 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_line(v_temp.ename); end loop; close c;end;注意循环里的三条语句是不能颠倒位置的,比如后两条一颠倒的话就会出现最后一条记录打印两次,而实际上最后是没找到的,结果明显不对。declare cursor c is select * from emp;begin for v_temp in c lo

58、op dbms_output.put_line(v_temp.ename); end loop;end;这是使用for循环和游标使用的情形,明显简单不用去管哪些细节比如是否found,open且不易出错,平常常用。declare cursor c(v_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 c(30,CLERK) loop dbms_output.put_line(v_temp.

59、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; v_b number :=4; v_re

60、t number; v_temp number :=5;begin p(v_a, v_b, v_ret, v_temp); dbms_output.put_line(v_ret); dbms_output.put_line(v_temp);end;/注意即便是你这过程有错误同样会被创建,为了展现出错的地点能够敲入命令:show error;。编写函数是用得不太多的,我们能够了解一下,原来那些函数能用在什么地点,你写的一样能够。形如:create or replace function sal_tax (v_sal number) return number is begin if (v_sal

温馨提示

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

评论

0/150

提交评论