ORACLE第五次实验报告Word文件下载.docx
《ORACLE第五次实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《ORACLE第五次实验报告Word文件下载.docx(13页珍藏版)》请在冰点文库上搜索。
![ORACLE第五次实验报告Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/00b12f70-6b73-4f25-9754-787b8fc81429/00b12f70-6b73-4f25-9754-787b8fc814291.gif)
例子1:
createsequences1INCREMENTby1STARTwith10MAXVALUE9999NOCYCLE
例子2:
createtabletest_seq
(c1intprimarykey,c2int)
insertintotest_seq
values
(s1.nextval,1)
selects1.currvalfromdual;
注意:
(1)第一次NEXTVAL返回的是初始值;
随后的NEXTVAL会自动增加你定义的INCREMENTBY值。
(2)CURRVAL总是返回当前sequence的值,但是在第一次NEXTVAL,初始化之后才能使用CURRVAL,否则会出错。
3、当用序列向表中的主健插入值,还会出现向198页所提到的Insert阻塞吗?
请用实验验证。
4、trunc和bitand的作用。
5、v$lock(存放事务的锁的信息)和v$transaction(存放事务信息)
新建一个事务,查询v$lock和v$transaction来看该事务拥有锁的情况。
6、选作:
删除一个表中的重复行。
实验步骤:
一、验证rownum与rowid的作用。
进入Oracle并打开数据库,操作如下:
创建一个表myemp,如下:
并插入数据,如下:
注:
这里用到了SEQUENCE,必须先创建一个seq这个序列才能插入数据,具体关于序列的方法见下【二】题。
再执行两次myemp表中就有14*4=56行了,查询结果如下:
……………………
1、验证rownum的作用
1)由上可初步判定rownum就是行数/行号,但并非仅如此。
再来看看他的特征,如下:
原表中的前面四行结果如下:
按照姓名排序的前四行,结果如下:
结论:
可知,只按照姓名排序后,rownum行的行号是以前的行号。
运用子查询后前四行的结果如下:
可知,rownum是根据表记录输出的行号,与筛选语句、排序语句都无关所以当用子查询时等于生成了一个表于是就按照这张表从1开始排序了。
2)用rownum进行查询的各种特点,如下:
用符号(<
、<
=、!
=)来进行查询,如下:
这样的查询语句就只能运用以上的三个符号(<
=)来进行查询,但是(>
、>
=、=、betweenand)这些符号是查询不出来结果的,或者说结果为0行。
可是用子查询可以解决符号(>
=、=)的查询,如下:
2、验证rowid的作用
Rowid是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码的18个字符显示。
并且存储在表中,可以从表中查询,但不支持插入,更新,删除它们的值。
1)Rowed的查询情况如下:
2)把rowid转换成页号(每一页的编号),如下:
把每行换成页,方便按页进行选择,这可以进行分页的处理。
3)把rowid转换成行号(每一行的编号),如下:
…………………………
rowid确定了每条记录是在Oracle中的哪一个数据对象、数据文件、块、行上。
ROWID的格式如下:
数据对象编号
文件编号
块编号
行编号
OOOOOO
FFF
BBBBBB
RRR
32bit10bit22bit16bit
由data_object_id#+rfile#+block#+row#组成,数据文件占用10个bytes的空间,所以每个表空间不能超过1023个数据文件。
3、假如一个表有50行内容,如何提取表中的10-20行的内容?
在表myemp中有56行数据,用betweenand来查询,如下:
也可以用如下方法:
这两种方法都是用的子查询,而且第二种方法必须是子查询里是<
=符号,外面的是>
=。
二、创建Oracle的序列,并使用序列和理解序列。
1、创建序列,如createsquences1INCREMENTby1STARTwith10MAXVALUE9999NOCYCLE
2、利用创建的序列seq,使其自动生成到表myemp中。
3、深刻理解序列。
(2)CURRVAL总是返回当前sequence的值,但是在第一次NEXTVAL,初始化之后才能使用CURRVAL,否则会出错。
三、当用序列向表中的主健插入值,还会出现向198页所提到的Insert阻塞吗?
1、在表myemp中将列empno设置为主键,如下:
2、使用序列向表myemp中插入值,如下:
4、如果向表myemp中插入了表中有相同的行,会发生阻塞错误,如下:
结论:
向表中的主键插入值时,不会发生198页所提到的Insert阻塞
五、v$lock(存放事务的锁的信息)和v$transaction(存放事务信息)
1、新建一个事务,用v$lock、v$session来看该事务拥有锁的情况。
在建立一个事物前,我们先看一下v$lock和v$transaction事务拥有锁的情况,如下:
再执行一条语句,如下:
再来看一下v$lock和v$transaction事务拥有锁的情况,如下:
说明lmode=6是一个排它锁。
下面在另一个会话(第二个)中执行下面语句:
更新表myemp时被阻塞。
同时这个会话将表scott.emp自动设置了一个排它锁
再查看一下v$lock和v$transaction事务拥有锁的情况,如下:
在lmode列中有两个值等于6,说明有两个会话设置了排它锁,而在request中有一个值为6,说明在第一个会话中不拥有这个排它锁,而需要等待第一个会话去释放这个锁。
当这个会话释放这个所后,可看到如下结果:
这时只有第二个会话才拥有这一个排它锁,也就是对表scott.emp的锁。
2、同时v$transaction也可以来看该事务拥有锁的情况。
如下进行查看:
原理同v$lock、v$session一样。
3、设置块的最大并发度
创建一个表test,并插入数据如下:
创建表的时候maxtrans2已经设置块的最大并发度
查看这个表中的数据是否在一数据块上,如下查看:
可知:
他们已经在一个数据块60978中。
在第一个会话中执行语句:
在第二个会话中执行语句:
在第三个会话中执行语句:
这是这三行在同一个数据块上,而且maxtrans设置为2,所以在第三个会话上被阻塞。
六、选作:
1、向表myemp中插入几个相同的行,如下:
结果如下:
2、查询重复行的方法:
查询重复行,如下:
查询行的另一种方法,如下:
3、删除重复行的方法:
删除重复行,如下:
删除重复行的另一种方法,如下:
这次删除重复行之前,插入了一行:
empno=7499;
5、删除后结果如下:
……………………