oracle中表空间管理,游标
一、表空间
oracle使用表空间来管理数据库的对象(表,序列,过程,函数,游标等)。
oracle的逻辑结构(看不见的):oracle数据库 =》 表空间 =》 表 序列 过程等对象。
oracle的物理结构(能看见):oracle 数据库 =》oracle的数据文件=》数据段=》数据区间=》数据块 。
oracle的数据文件分三种:
1、控制文件,以ctl结尾,控制文件中存储oracle运行所需要的字典,用户等对象。
2、日志文件,以log存储oracle操作产生的日志文件,还包含oracle的重做日志。
3、数据文件,存储用户或者系统创建的对象
表空间也是对象,需要存储到数据文件中,所以创建表空间的时候需要指定使用哪个数据文件。
创建表空间的语法:
create tablespace 表空间名称
datafile '存储的位置\文件名.dbf' 指定表空间使用的数据文件,如果文件不存在会自动创建
size 50m 表空间的初始大小
autoextend on next 30m 表空间如果空间不够用了,下次自动扩展的大小
maxsize 300m指定表空间的最大存储空间;
例子:
-- 创建表空间
create tablespace tab_test01
--指定使用的数据文件
datafile 'D:\test_tab\test01.dbf'
--指定表空间的初始大小
size 50m
--当表空间不够用时,下次自动增长的大autoextend on next 30m
--表空间自动增长的最大值
maxsize 300m;
-- 创建表空间
create tablespace tab_test02
--指定使用的数据文件
datafile 'D:\test_tab\test02.dbf'
--指定表空间的初始大小
size 50m;
表空间用到的物理文件,不要在磁盘上直接删除,否则数据库将不能正常启动,如果要删除数据文件,需要先删除表空间:
drop tablespace tab_test02;
oracle中有内置的默认的表空间:
1、TEMP01.DBF 临时表空间,存储oracle数据库运行产生的临时数据
2、UNDOTBS01.DNF重做表空间,存储数据库产生的重做文件。
3、USERS01.DBF用户表空间,存储默认用户的数据。当创建用户且用户不指定默认表空间的时候会使用该表空间。
二、用户管理
oracle中有三个重要用户 sys system scott,我们也可以自己创建用户
创建用户的命令:
create user 用户名 identified by 用户密码 default tablespace 表空间名称;
注意:创建用户的时候可以不指定默认表空间,如果不指定会使用系统的USERS的表空间
例子:
--创建用户 并指定使用tab_test01表空create user zhangsan identified by 123456
default tablespace tab_test01;
-- 创建用户,不指定默认表空间
create user lisi identified by 123456;
删除用户:
-- 指定cascade代表把用户和用户下的对象都一起删除。
drop user 用户名 [cascade];
修改用户密码:
alter user zhangsan identified by 123456;
connect连接数据库的角色,可以执行数据库的增删改查,但是不能执行数据库表的增删改,一般在开发环境中给用户赋予这种角色
resource开发者角色,可以执行数据库对象的增删改查,我们一般在开发中使用这种角色。
dba 数据库管理员角色,最高权限,可以执行数据库的任何操作,一般不建议使用这种角色。
给用户赋予角色可以使用如下语句:
grant 角色名1,角色名2... to 用户;
例子:
--为张三用户赋予连接的权限
grant connect to zhangsan;
--为张三赋予开发权限
grant resource to zhangsan;
--为张三同时赋予连接和开发权grant connect ,resource to zhangsan;
撤销权限可以使用以下语句:
--撤销张三的开发权限
revoke resource from zhangsan;
三、游标
1、游标的概念:游标是数据库中可以操作的一块内存区,可以方便的帮我们从数据库中获取数据,一般使用游标来遍历数据。
使用游标的语法:
declare
-- 声明游标变量
cursor 游标变量名称 is sql语句;
begin
-- 打开游标
open 游标变量名称;
loop
-- 从游标中获取数据
fetch 游标变量名称 into rowtype 类型变量/record类型变量;
-- 判断是否从游标中获取到了数据,如果没有获取到数据,应该跳出循环
if 游标变量%农田found then
exit;
end if;
语句块;
end loop;
--关闭游标
close 游标变量名称;
end;
例子:输出部门表的所有数据
--输出部门表的所有数据
declare
--声明游标变量
cursor cur_dept is select * from dept;
--声明行类型变量,用来接收游标获取到的数据
v_dept dept%rowtype;begin
--打开游标
open cur_dept;
loop
--从游标中获取数据
fetch cur_dept into v_dept;
-- 判断是否从游标中获取到了数据,如果没有获取数据跳出循环
--if cur_dept%notfound then
-- exit;
--end if;
--if 可以简写成如下形成
exit when cur_dept%notfound;
--打印数据
dbms_output.put_line('第'||cur_dept%rowcount||'行,部门编号:'||v_dept.deptno||',部门名称:'||v_dept.dname);
end loop;
--关闭游标
close cur_dept;
end;
可以使用游标名称%属性名称 来访问游标的属性 ,游标常用的有四个属性:
属性值 |
说明 |
| isopen | 判断游标是否已经打开 |
| found | 判断游标是否取到了数据,如果获取到了数据返回真,否则返回假 |
| notfound | 判断游标是否获取到了数据,如果获取到了数据返回假,否则返回真 |
| rowcount | 返回当前游标获取到的数据的行号 |
2、游标可以分为显示游标和隐含游标两种类型
显示游标
使用游标的时候可以给游标定义参数,这样游标就可以传不同的参数多次使用了
举例:写一个游标,根据部门编号,打印该部门下员工的信息
declare
--声明游标变量 ,加入参数
cursor cur_emp(v_deptno number) is select * from emp where deptno=v_deptno;
v_emp emp%rowtype;
begin
--打印部门编号为10的员工的信息
--打开游标
open cur_emp(10);
loopfetch cur_emp into v_emp;
exit when cur_emp%notfound;
dbms_output.put_line('员工编号:'||v_emp.empno||',员工姓名:'||v_emp.ename);
end loop;
--关闭游标
close cur_emp;
dbms_output.put_line('======');
--打印部门编号为20的员工的信息
--打开游标
open cur_emp(20);
loop
fetch cur_emp into v_emp;
exit when cur_emp%notfound;
dbms_output.put_line('员工编号:'||v_emp.empno||',员工姓名:'||v_emp.ename);
end loop;
--关闭游标
close cur_emp;
end;
我们也可以一次性取出游标的所有数据,放入到table类型变量中:
declare
--声明游标变量 ,加入参数
cursor cur_emp(v_deptno number) is select * from emp where deptno=v_deptno;
--声明table类型
type emp_table_type is table of emp%rowtype
index by binary_integer;
-- 声明table类型变量
v_emp emp_table_type;
begin
--打印部门编号为10的员工的信息
--打开游标
open cur_emp(10);
--一次性取出游标中的所有数据 ,放入table类型变量中
fetch cur_emp bulk collect into v_emp--关闭游标
close cur_emp;
--循环输出table类型变量中的内容
for v_i in v_emp.first .. v_emp.lasloop
dbms_output.put_line('员工编号:'||v_emp(v_i).empno||',员工姓名:'||v_emp(v_i).ename);
end loop;
end;
游标for循环
每次使用游标都需要打开和关闭游标,比较麻烦,我们可以使用游标for循环来简化游标的使用方式。
例子:打印部门表所有的内容
declare
-- 声明游标变量
cursor cur_dept is select * from dept;
begin
-- 使用游标for循环不需要显式的打开或者关闭游标
-- 循环变量也不需要显式声明,该游标变量是行类型rowtype类型或者记录类型record
for v_dept in cur_dept
loop
dbms_output.put_line('部门编号:'||v_dept.deptno||',部门名称:'||v_dept.dname);
end loop;
end;
游标for循环可以继续简写:
begin
-- 游标for循环简写
for v_dept in (select * from dept)
loop
dbms_output.put_line('部门编号:'||v_dept.deptno||',部门名称:'||v_dept.dname);
end loop;
end;
注意:in后面一定加上小括号
游标变量类型
以前的游标没有办法从不同的表中取数据,在大项目中,有可能需要声明很多游标变量,非常繁琐,我们可以使用游标变量类型来解决这个问题
例子:声明游标变量类型,先从打印员工表数据,再打印部门表数据。
declare
--声明游标变量类型
type cur_test_type is ref cursor;
-- 声明cur_test_type类型的游标变量
cur_test cur_test_type;
v_emp emp%rowtype;
v_dept dept%rowtype;
begin
-- 先打印员工表所有数据
--打开游标,同时告诉该从哪个表取数据
open cur_test for select * from emp;
loop
fetch cur_test into v_emp;exit when cur_test%notfound;
dbms_output.put_line('员工编号:'||v_emp.empno||',员工姓名:'||v_emp.ename);
end loop;
--关闭游标
close cur_test;
--再使用cur_test游标变量从部门表取数据
open cur_test for select * from dept;
loop
fetch cur_test into v_dept;
exit when cur_test%notfound;
dbms_output.put_line('部门编号:'||v_dept.deptno||',员工姓名:'||v_dept.dname);
end loop;
--关闭游标
close cur_test;
end;
隐含游标
oracle中也有隐含游标,在所有增删改语句执行之后,数据库会默认我们创建一个隐含游标,名字叫sql,我们可以访问隐含游标的属性,隐含游标不需要打开或者 关闭。
例子:删除员工,如果员工编号不存在,打印错误信息
begin
delete from emp where empno=9999;
--通过隐含游标判断是否删除成功
if sql%found then
dbms_output.put_line('删除成功');
else
dbms_output.put_line('删除失败');
end if;
end;
四、面试题
1、oracle中有几种内置角色
connect resource dba
2、游标的四个属性是什么
isopen found notfound rowcount
oracle中表空间管理,游标的更多相关文章
- Oracle表空间管理
oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE; //修改表空间数据文件类型 2.ALT ...
- ORACLE表空间管理维护
1:表空间概念 在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成. 如下图所示, ...
- ORACLE表空间管理方式segment和extent
A permanent tablespace contains persistent schema objects. Objects in permanent tablespaces are stor ...
- ORACLE 临时表空间管理
临时表空间和临时段 临时表空间用于存放排序.临时表等数据,其信息不需要REDO,因此临时表的DML操作往往比普通表产生的REDO少很多.临时表数据变化不产生REDO,UNDO数据变化产生REDO.临 ...
- oracle 表空间管理
1.创建表空间 03:01:55 sys@ORADB11G> create tablespace TSPITR datafile '/u01/app/oracle/oradata/TSPITR0 ...
- ArcSDE for Oracle表空间管理——暂时(TEMP)表空间
Oracle暂时表空间主要用来做查询和存放一些缓冲区数据.暂时表空间消耗的主要原因是须要对查询的中间结果进行排序. 重新启动数据库能够释放暂时表空间,假设不能重新启动实例,而一直保持问题sql语句的运 ...
- oracle中表空间的相关操作
Oracle 创建表空间 注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[E:\app\Quentin\oradata\orcl] ...
- oracle 表空间管理相关(原创)
通过以下几步基本可以查看表空间情况以及处理表空间不足问题. ASM相关 查看asm空间 select group_number,name,total_mb,free_mb from v$asm_dis ...
- Oracle表空间管理相关
以下以我自己的测试环境举例: 1.表空间的 block_size 为 8192字节,即8KBytes.从数据字典中查到 max_size 为 2147483645,即约为15.9TBytes. 2.在 ...
随机推荐
- 吴裕雄--天生自然python学习笔记:Python3 SMTP发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...
- springmvc拦截器入门及其执行顺序源码分析
springmvc拦截器是偶尔会用到的一个功能,本案例来演示一个较简单的springmvc拦截器的使用,并通过源码来分析拦截器的执行顺序的控制.具体操作步骤为:1.maven项目引入spring依赖2 ...
- Pandas写excel总结:写入多个sheet、1个sheet写入多行、向已有sheet追加数据
1.最简单最基础的写:1excel1sheet df.to_excel("test.xlxs") 2.在一个excel文件里面写入多个sheet writer=pd.ExcelWr ...
- win7/win8下vmware/VirtualBox虚拟网卡显示未识别网络的解决
http://blog.csdn.net/zengxianying/article/details/44017227
- ltp压力测试结果分析脚本
最近工作性质发生了改变,在做操作系统方面的测试.接手的第一个任务是做ltp stress.测试内核稳定性. 做完之后会结果进行统计分析.因为统计的内容比较多,都是通过shell命令行进行操作.于是编写 ...
- MyBatis之ResultMap的association和collection标签(一)
1.先说resultMap比较容易混淆的点, 2. Map结尾是映射,Type是类型 resultType 和restltMap restulyType: 1.对应的是java对象中的属性,大小写不 ...
- http 详解
HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...
- udev更改按键映射
通过更改udev的规则实现敲击a键获得s的输出 安装evtest 首先安装evtest检测键盘的扫描码 123456789 # apt install evtest# sudo evtestNo ...
- C++走向远洋——24(项目一,三角形,复制构造函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...
- 图形用户界面(GUI)应用程序开发——菜鸟的第一步
参考资源:贺老师博文 在看完贺老师的博文后,我就照葫芦画瓢的做了个求三角形面积的程序.这是我写的一篇所用时间最长博文(两个多小时,真心挺累,或许是我太笨吧),为了尽可能详细的把步骤写明白我截了二十一张 ...