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.在 ...
随机推荐
- SpringMVC学习笔记九:拦截器及拦截器的简单实用
SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...
- Twitter类社交平台 用比例建立新的“好坏”与社会焦点
用比例建立新的"好坏"与社会焦点" title="Twitter类社交平台 用比例建立新的"好坏"与社会焦点"> 互联网全面 ...
- 在腾讯云服务器上安装JDK+Tomcat并启动tomcat
由于Java web项目需要使用到tomcat所以决定在腾讯云服务器(centos7.X)上安装JDK和tomcat,来部署我们的项目. 准备工具: 云服务器:centos7.x+ 本地连接服务器:X ...
- Apache JMeter--1基础介绍
一.JMeter 介绍 近期公司要做jmeter调研,将性能测试推广到全部测试组,便一边学习一边做记录. Apache JMeter是100%纯JAVA桌面应用程序,是一款优秀的开源性能测试工具,被设 ...
- Python如何让字典保持有序
问题: Python如何让字典保持有序 ? 解决方案: 使用collections.OrderedDict代替Dict. 验证程序: from collections import OrderedDi ...
- JavaScript学习之内存
初学JavaScript时,看红皮书了解了JS基本类型和引用类型在内存中的位置,结果看了简书里的一篇文章,发现对这块的了解还是有些缺陷. 基本类型 JavaScript中的基本类型有五种:Undefi ...
- postgresql学习记录1
数据库9.3.5,系统fedora20,不同系统操作略有不同. 使用yum 命令安装即可:sudo yum install postgresql,postgresql-server 安装完毕后系统中会 ...
- ubuntu16.04问题 · 最初的梦想
ubuntu 包管理器命令 1 $ sudo synaptic 安装主题 1 $ sudo apt-get install unity-tweak-tool 下载主题 https://www.sysg ...
- Rails工程实战记录
项目git:https://github.com/yixiaoyang/ruby 为熟悉Rails的基本特性创建的工程,本博文仅作更新记录. (1)2013.10.1-2013.10.5 Ruby基本 ...
- PostgreSQL没有认证密码就登陆了缘由
上午同事爆出这样的问题,使用正确的用户名和错误的密码连接了postgresql数据库,竟然连上了.这不是故意这样神操作,不小心密码写错了,咋一看这样怎么能行,随便输入一个密码都能登陆上.自己测试也是同 ...