1、事务(Transaction )
1)命名事务
set transaction name ‘transaction_name ’;
2)查看事务是否存在
select name from v$transaction;
3)提交事务
commit (注:事务提交以后,就不存在了)
4)设置事务读一致性(只读事务)
set transaction read only; (注:只读事务内只能执行一些有限的SQL语句)
5)设置回滚点
savepoint sp1;
6)回滚到回滚点
rollback to savepoint sp1;
7)自治事务
允许用户在事务中建立一个新的事务,也就是事务中嵌套一个新的事务。新的事务叫自治事务(Autonomous Transaction AT),原来的事务叫主/父事务(Main Transaction MT),自治事务的提交回归不会影响主事务。使用:pragma autonomous_transaction指定自治事务。
2、oracle数据类型
oracle的数据类型分为内置(标准)数据类型和用户自定义数据类型。内置数据类型包括:
3、表结构管理
1)oracle的表类型
- 普通表(Ordinary Table)又叫堆组织表(Heap Organized Table)
- 聚族表(Cluster Table)
- 分区表(partitioned Table)
- 外部表(External Table)
- 临时表(Temporary Table)
- 索引组织表(Index-Organized Table IOT)
普通表:平常所指的表,数据以无序的方式存储
聚族表:聚族是表的一种特殊结构。一个聚族由多个表组成,几个表共享相同的数据块。一个聚族由一个或多个公共的列,称为聚族关键字(Cluster Key)。oracle把多个表的数据物理的存储在一起,以加速表的连接(join)。只有创建了聚族后才能在聚族中创建表,这些表叫聚族表。在往聚族表中插入数据之前,必须在聚族上创建聚族索引。
适合使用聚族的情况:
- 目的是为了查询,而不是为了修改,频繁修改的表不适合使用聚族;
- 查询时,常常对聚族中的多个表进行连接。
外部表:数据库中只存放外部表的定义,外部表的数据存放在数据库之外,外部表的数据以文件的形式存放在操作系统中。创建外部表时需要指定访问驱动(Access Driver),访问驱动用于把外部数据读入oracle中,oracle提供两种类型的驱动:oracle_loader(默认)和oracle_datapump。外部表是只读的,不能在外部表上执行任何DML。
临时表:值表中的数据是临时存在的。临时表的数据只存在一次会话或一个事务中,而临时表的定义永久存在数据字典中。临时表的数据存放在临时表空间中。临时表上可以执行DML语句、建视图和索引,不产生重做日志和回滚日志。临时表分两类:
- 会话型临时表(session-specific):数据只存在会话期间,如果用户提出登陆,oracle自动删除临时表中的数据,是私有的,每个会话只能修改自己的临时表数据。
- 事务型临时表(Transaction-Specific):数据只存在事务期间,如果事务结束,oracle自动删除临时表中的数据。
索引组织表:是一类特殊的表,将索引和表的数据存储在一起,按照主键进行排序,以二叉树的形式对表的数据进程存储。二叉树中每个索引条目用<主键值,非主键值>来表示。不存储ROWID,通过主键来访问数据,适合通过主键对数据进行访问的应用。索引组织表的优点:
- 快速的随机访问
- 快速的范围扫描
- 更少的存储需求
普通表的索引条目包含索引值和指向数据行的ROWID,而索引组织表中的索引条目不仅包含索引值还包含索引数据,表的数据很大时索引条目不能够容纳,因此,在索引组织表中一条记录分为两部分进行存储:
- 索引部分:存放主键值、频繁访问的非主键值、指向溢出区的ROWID
- 溢出区:存放非主键值,溢出区存放在一个溢出表空间中(用户可指定)
哑表:创建数据库时由oracle自动创建的一种表dual。
2)建表
2.1)创建普通表:
create table tb_ordernary1
(
id number not null primary key, --指定列非空、主键
name varchar2(20) default 'os', --指定列的默认值
address varchar2(40)
)
tablespace myspace --指定表存放的表空间
storage --指定表的存储参数
(
initial 64K --指定初始区的大小
next 1M --指定下一个区的大小
minextents 1 --指定最少要分配多少个区
maxextents unlimited --指定区的最大数量
);
2.2)创建聚族表:
- 创建聚族:create cluster tb_cluster(postcode int) tablespace myspace;
- 把表加入聚族中(创建聚族表):
create table student
(
id int primary key,
name varchar2(20) not null,
postcode int
)
cluster tb_cluster(postcode);create table address_info
(
postcode int primary key,
name varchar2(40),
detail varchar2(40)
)
cluster tb_cluster(postcode);
2.3)创建索引组织表:
create table students
(
name varchar2(20) primary key,
id number,
detail varchar2(100)
)
organization index --指定创建的表是索引组织表
tablespace users
pcctreshold 30 --指定溢出比例,如果超过溢出比例,溢出部分将被存储到溢出区中
including detail --指定列名,表示从这个列以后的所有列将存储在溢出区中
overflow tablespace myspace; --指定溢出表空间
2.4)创建外部表:
在操作系统中创建目录和文件,如:D:\temtb\data、D:\temtb\log、D:\temtb\bad目录,D:\exdata\temstu.txt,文件的内容如:50016,小张,上海,22 ...确保oracle对这些目录有读写权限。
- 创建目录对象:
create or replace directory dat_dir
as 'D:\temtb\data'; --存放数据,使用外部表的用户需要对该目录有读权限create or replace directory log_dir
as 'D:\temtb\log'; --存放日志,使用外部表的用户需要对该目录有读权限create or replace directory bad_dir
as 'D:\temtb\bad'; --存放坏文件,如果一条记录引起oracle错误,这条记录将被写到坏文件中,使用外部表的用户需要对该目录有读写权限
2. 按要求授予用户rawman对目录的读写权限,如:grant read,write on directory bad_dir to rawman;
3. 使用rawman用户登录数据库,创建外部表:
create table fitness_member --外部表的名字
(
id int,
name varchar2(14),
city varchar2(30),
age int
)
organization external --表示创建的表是外部表
(
tpye oracle_loader --指定访问驱动
default directory dat_dir --指定数据的默认存放路径
access parameters --
(
records delimited by newline --一行为一条记录
badfile bad_dir:'empxt%a_%p.bad' --指定坏文件的名字和路径
logfile log_dir:'empxt%a_%p.log' --指定日志文件的名字和路径
fields terminated by ',' --指定字段之间以‘,’进行分隔
missing field values are null
(id,name,city,age)
)
location ('temstu.txt') --指定存放数据的文件的名字
)
parallel
reject limit unlimited; --表示允许无限制的行发生错误
2.5)创建临时表:
创建事务型临时表:
create global temporary table gtt2
(
name varchar2(20),
id number,
bithday date
)
on commit delete rows; --指定创建表是事务型临时表
创建会话型临时表:
create global temporary table gtt4
(
name varchar2(20),
id number,
bithday date
)
on commit preserve rows; --指定创建表是会话型临时表
2.6)表的克隆:
create table t_clone1
as select * from stb
[where 1=0];
3)修改表
3.1)添加列:alter table tb_ordernary add (lenth number (8,3));
3.2)列的重命名:alter table tb_ordernary rename cloumn lenth to new_lenth;
3.3)改变列的属性:
alter table tb_ordernary modify (lenth number(4,1)); --修改列的宽度
alter table tb_ordernary modify (lenth default 5); --修改列的默认值
alter table tb_ordernary modify (lenth not null); --设置列不能为空
alter table tb_ordernary modify (lenth encrypt using '3des168'); --对列进行加密
alter table tb_ordernary modify (lenth decrypt); --对列进行解密
3.4)为表手工分配一个新区:alter table tb_ordernary allocate extent (size 50K);
3.5)删除某些列:alter table tb_ordernary drop (name,address);
4)表管理
4.1)把表移动到一个新的段(可同时修改表的存储属性):
alter table tb_ordernary move
storage
(
initial 20K
next 40K
minextents 2
maxextents 20
pctincrease 0
);
4.2)把表移动到其他表空间:
alter table tb_ordernary move tablespace myspaces2
4.3)锁表:
往表上加行级锁:
lock table studentbook
in exclusive mode
nowait
锁住表中指定的行:
select * from tb_ordernary where name = ‘李%’ for update;
解锁(提交或回滚事务,锁将被解开):
commit; / rollback;
4.4)让一个列自动增长:使用序列和触发器
4.5)把表放入只读模式:
alter table tb_ordernary read only; (注:只读模式的表上可执行的操作有限制)
4.6)恢复表到读写模式:
alter table tb_ordernary read write;
4.7)判断表的存在性:
select * from user_name.table_name;
4.8)找出当前用户模式下,哪些表的哪些列的数据类型是日期类型,并列出表及相关列:
select c.table_name, c.column_name
from user_tab_cols c
where c.data_type = 'date'
order by table_name;
4.9)查询出组成表的列:
用desc命令:desc tb_date_test;
查询视图all_tab_columns(或dba_tab_columns),如:select column_name,data_type,nullable,data_default from all_tab_columns where table_name =
'tb_date_test';
4.10)计算一个表的大小:
select segment_name, sum(bytes)/1024/1024||'M'
from dba_extents
where segment_name = 's_employee'
group by segment_name;
5)删表
5.1)分步骤彻底删除表:
- 删除表:drop table tb_ordernary [cascade constraints]; --并未真正删除表,只是把表放在回收站中,可执行show recyclebin查看,执行select * from recyclebin查看回收站中的对象
- 清空回收站中所有表:purge recyclebin;
- 清空回收站中指定的表:purge table "BIN$6IW9QnJsT7G+11YvJdfdvA==$0":
5.2)一次彻底删除表:
drop table tb_ordernary purge;
4、表数据管理
1)insert语句
1.1)往表中插入数据(指定列名):
insert into departments(department_id,department_name,manager_id,location_id)
values(220,'Recreation',111,7200);
1.2)往表中插入数据(未指定列名):
insert into departments
values(220,'Recreation',111,7200);
1.3)插入字符&:
- 在sqlplus中执行:set define off; --关闭替代变量 后直接插入即可。
- 使用函数chr:insert into tb_char values (chr(38));
1.4)根据一个表往另一个表中插入数据(拷贝表的数据):
insert into t_target(id,name)
select id, name
from t_source t
where t.address='上海';
1.5)插入日期:
insert into tb_date
values(to_date('2009-9-9 12:15:55','YYYY-MM-DD HH24:MI:SS'));
1.6)插入NULL:
insert into test_table
values('wangji',null);
2)update语句
2.1)更新单列:
update test_table set location = '深圳' where id = '111';
2.2)更新多列:
update test_table set salary = salary + 1000, location = null where age > 50;
2.3)利用子查询对表进行更新:
update test_table
set major=(select source.major from source where source.id=test_table.id)
where test_table.id=(select source.id from source where source.id=test_table.id);update test_table
set major=(select source.major from source where source.id=test_table.id)
where test_table.id in(select source.id from source);update test_table
set major=(select source.major from source where source.id=test_table.id)
where exists (select source.id from source where source.id=test_table.id);
3)delete语句
3.1)删除表中所有数据行:
delete from test_table;
3.2)删除表中特定数据行:
delete from test_table where age=18;
3.3)用最快的方法删除数据:
truncate table test_table; (注:truncate是DDL语句,无需commit)
3.4)删除重复记录(利用rowid和max/min函数):
利用not in:
delete from test_table
where rowid not in(select min(rowid) from test_table group by id)
利用!=
delete from test_table a
where rowid !=(select max(rowid) from test_table b where a.id=b.id)
利用临时表:
create table tem_table
as
(select distinct id,first_name,last_name,major from test_table);truncate table test_table;
insert into test_table
select * from tem_table;
5、约束管理
1)oracle有5种类型的约束
- 不为空约束(NOT NULL Integrity Constraints)
- 唯一约束(UNIQUE KEY Integrity Constraints)
- 主键约束(PRIMARY KEY Integrity Constraints)
- 参照性完整性约束(Referential Integrity Constraints):即外键约束,其原理是:如果列A是表R1的外键,它与表R2的主键K相对应,则表R1中列A的每个值要么取空(NULL)值,要么等于表R2中主键K的值。R2叫父表,R1叫主表。删除子表的数据对父表没影响,而删除父表时需要先与子表接触外键约束关系。
- 检查约束(CHECK Integrity Constraints)
主键约束和唯一约束的区别:
- 主键会隐含创建唯一性索引
- 主键可以作为外键,唯一约束不可以
- 组成主键的如何一列不允许为空,唯一约束可以
- 每个表上只能有一个主键,却允许有多个唯一约束
2)创建约束
2.1)创建主键约束:
create table test_table
(id varchar2(10) primary key, name varchar2(10),keynumber number); --创建表时指定主键alter table test_table
add primary key (id,name); --在已存在的表上添加主键alter table test_table
add constraint PK3 primary key (id,name); --在已存在的表上添加主键并指定约束名
2.2)创建唯一约束:
create table test_table
(id varchar2(10) unique, name varchar2(10),keynumber number); --创建表时指定唯一约束alter table test_table
add unique (id,name); --在已存在的表上添加唯一约束alter table test_table
add constraint PK3 unique (id,name); --在已存在的表上添加唯一约束并指定约束名
2.3)创建不为空约束:
create table test_table
(id varchar2(10) not null, name varchar2(10),keynumber number); --创建表时指定不为空约束alter table test_table
modify (name not null); --在已存在的表上添加不为空约束
2.4)创建检查约束:
create table test_table
(id varchar2(10), name varchar2(10),
keynumber number constraint c_check check(keynumber between 10 and 20)); --创建表时指定检查约束alter table test_table
add constraint c_check check(keynumber between 10 and 20); --在已存在的表上添加不为空约束
2.5)创建/添加外键约束:
alter table test_table
add constraint Refdepartment3 foreign key (dept_id) references department(dept_id) [on delete cascade];
3)删除约束
3.1)删除主键:
alter table test_table
drop primary key [cascade];alter table test_table
drop constraint PK3 [cascade]; --利用约束名来删除
3.2)删除唯一约束:
alter table test_table
drop unique (name);alter table test_table
drop constraint UK_DEPT [cascade]; --利用约束名来删除
3.3)删除不为空约束:
alter table test_table
modify (name NULL);
3.4)删除检查约束:
alter table test_table
drop constraint c_check; --利用约束名来删除
3.5)删除/解除外键约束:
alter table test_table
drop constraint Refdepartment3;
4)使能约束
4.1)使约束失效:
alter table emp
disable constraint emp_empno_pk [cascade];
4.2)使约束生效:
alter table emp
enable constraint emp_empno_pk;
5)查询约束
5.1)查询当前用户在某个表上的所有约束:
select constraint_name, constraint_type, search_condition
from user_constraints
where table_name = 'EMP';
5.2)查询约束建立在哪些列上:
select constraint_name, column_name
from user_cons_columns
where table_name = 'EMP';
6、LOB管理
大对象数据类型(Large Object Data Types, LOB)用于存储大文本、图像、视频、声音等信息。oracle定义了4种大对象类型:BFILE、BLOB、CLOB、NCLOB。LOB数据是存入到数据库中的值,而LOB定位器(LOB Locators)是操作这些值得指针,要读取或修改LOB数据时,必须先要获取LOB定位器,然后通过LOB定位器来读取或修改LOB数据。通过DBMS_LOB包中的read()、append()、write()、copy()等方法可以检索和操作LOB数据。LOB数据可以和主表数据分别存放在不同的表空间,如:
create table test_table
(
bf bfile,
b1 blob,
c1 clob,
nc1 nclob
)
LOB (c1) store as (tablespace users)
LOB (b1) store as (tablespace myspace);
1)bfile
bfile存放的是文件指针(file locator),该指针指向数据库之外的操作系统文件,数据实际存放在操作系统中。bfile是只读的,需要保证oracle有权限读取bfile指向的文件。rollback和commit对bfile指向的文件没有影响。bfile的应用例子如下:
1. 创建学生表信息:
create table bfile_student
( name varchar2(10),
resume bfile
);
2. 创建目录对象并授权:
create directory dir_resume as 'E:\resume';
grant read on directory dir_resume to item;
3. 往表中插入数据:
insert into bfile_student(name,resume) values('liuhong', bfilename('dir_resume','liuhong_resume.doc')); --bfilename函数返回文件指针
4. 更改指针:
update bfile_student set resume=bfilename('dir_resume','liuhong_resume2.doc')
5. PL/SQL块中使用bfile:
delare
s_bfile bfiel; --定义变量,数据类型为文件指针
begin
select resume into s_bfile from bfile_student where name='liuhong'; --获得文件指针
dbms_lob.fileopen(s_bfile,dbms_lob.file_readonly);
...
--对文件的各种操作,如使用dbms_lob.loadclobfromfile读文件内容
..
dbms_lob.close(s_bfile); --关闭文件
end;
2)blob
blob用于存储非结构化的二进制数据,最长达128TB,表列中存储的是LOB定位器(指定数据地址),实际的blob数据存储在数据库独立的表空间中。
3)clob
clob用于存储数据库字符集格式的字符数据,最长达128TB,表列中存储的是LOB定位器(指定数据地址),实际的clob数据存储在数据库独立的表空间中。
4)nclob
nclob功能与clob一样,只是nclob用于存放统一编码国家字符集数据。(blob、clob和nclob的应用类似,参阅其他资料)
7、用户自定义数据类型
oracle支持三种用户自定义数据类型(User-defined Type):对象类型、嵌套表类型、可变数组类型。
1)对象类型(Object Type)
对象类型用于描述客观世界中存在的事物,是在其他内置数据类型基础上建立的(也可以基于另一种对象类型),对象类型可以包含多个元素,称之为属性,还可以包含多种操作,称之为方法。
1.1)创建对象类型:
create or replace type schooltype as object --创建包含三个属性的对象类型
(
name varchar2(30),
city varchar2(30),
street varchar2(30)
);
1.2)删除对象类型:
delete type schooltype;
1.3)查看对象类型的结构:
decs schooltype;
1.4)对象类型的存储形式:
- 整个表只存储对象,这样的表称之为对象表(Object Table),每行表示一个对象,存储于对象表中的对象称之为行对象(Row Object)。
- 与表中其他数据存储在一起,对象之占表中的一列,这样的对象称之为列对象(Column Object)。
1.5)基于对象类型创建表:
create table school_info of schooltype; --创建对象表
create table student_info --创建含有对象的关系表
( name varchar2(10),
id number,
school schooltype
);
1.6)往表中插入数据:
insert into school_info values(schooltype('北大','北京','中关村'));
insert into student_info values('xiaoming','1111',schooltype('北大','北京','中关村'));
1.7)查询学生信息:
select stu.name, stu.id, stu.school.name, stu.school.city, stu.school.street from student_info stu;
2)可变数组类型(Varry Data Type)
可变数组是一个有序的相同数据类型元素的集合。每个元素均有一个索引编号(下标),通过下标访问数组元素。可变数组数据采用内联存储,即与其在同一表中的其他数据存储在同一个表空间内,也可以存储在BLOB中。可以基于标准oracle数据类型,也可以基于用户自定义数据类型。
2.1)创建可变数组类型:
create type address_list as varray(10) of varchar2(80); --基于基本数据类型,可变数组的最大元素数量为10,每个元素的数据类型是varchar2(80)
create type varray_phone as varray(10) of phone_type; --基于对象类型phone_type
2.2)删除可变数组类型:
drop type address_list;
2.3)创建含有可变数组类型的表:
create table instructor
( name varchar2(10),
phone_list varray_phone
);
2.4)往表中插入数据:
insert into instructor values
( '王老师',
varray_phone(
phone_type ('86', '101', '6634853'),
phone_type ('86', '120', '2564523'),
phone_type ('86', '131', '3489443')
)
);
2.5)查询王老师区号是101的所有电话信息:
select country_code, area_code, phone_number
from table(select phone_list from instructor where name='王老师')
where area_code='101';
2.6)更新含有可变数组的表(王老师搬到了另外一个城市,需要变更他家的区号并停掉一部电话):
update instructor
set phone_list=varray_phone(phone_type ('86', '110', '6634853'),phone_type ('86', '120', '2564523'))
where name='王老师';
3)嵌套表类型(Nested Table Data Type)
嵌套表是一个无序的相同类型数据元素的集合。可以基于标准oracle数据类型,也可以基于用户自定义数据类型。
3.1)创建嵌套表类型:
create or replace type bookobjtype as object --创建对象类型bookobjtype
(
bookid varchar2(10),
bookname varchar2(30),
describe varchar2(10)
);create or replace type booknestedtype as table of bookobjtype; --创建嵌套表类型
3.2)创建含有嵌套表类型的表:
create table studentbook
( student_name varchar2(10) not null primary key,
home_address varcha2(100),
booklist booknestedtype
)
tablespace jspace --jspace表示存放主表(studentbook)的表空间
nested table booklist store as booklist_table (tablespace myspace); --myspace表示存放子表(booklist_table)的表空间
3.3)查询主表的存放空间:
select tablespace_name from dba_tables
where table_name = 'studentbook';
3.4)查询子表的存放空间:
select tablespace_name from dba_segments
where segment_type = 'nested table' and segment_name = 'booklist_tabl' ;
3.5)删除嵌套表类型:
drop type booknestedtype;
3.6)往表中插入数据:
insert into studentbook values (
'王晓晓',
'上海',
booknestedtype
(
bookobjtype ('111','《中国通史》','历史类'),
bookobjtype ('222','《三个代表》','政治类')
)
);
3.7)查询嵌套表(查询学生刘晶拥有的书籍):
select * from table(select T.booklist from studentbook T where student_name='刘晶');
3.8)更新嵌套表(刘晶把自己的书籍小学数学换成了高等数学):
update table(select T.booklist from studentbook T where student_name='刘晶') TT
set TT.bookname='《高等数学》'
where TT.bookname='《小学数学》';
3.9)删除嵌套表中的数据(刘晶丢失了中国通史这本书):
delete from table(select T.booklist from studentbook T where student_name='刘晶') TT
where TT.bookname='《中国通史》';
8、数据库链接
数据库链接分为三类:
- 私有数据库链接(Private Database Link):只有创建该数据库链接的用户才可以使用它。
- 公有数据库链接(Public Database Link):该数据库的所有用户均可以使用它。
- 全局数据库链接(Global Database Link):当oracle网络使用目录服务器时,目录服务器自动创建全局数据库链接,并统一控制,如何数据库中的用户都可以使用全局数据库链接访问远程数据库。
1)创建数据库链接
create database link remotedb --创建私有数据库链接
connect to itme indentified by zero --itme/zero为远程数据库用户名/密码
using ‘MYZDB’; --MYZDB为网络服务名create public database link remotedb2 --创建私有数据库链接
connect to itme indentified by zero
using ‘MYZDB’;
2)使用数据库链接
oracle允许对远程数据库执行DML操作,而不允许执行DDL操作,使用DML时通过@引用远程数据库。如:
insert into kk@remotedb2 values('ssss');
select * from kk@remotedb2;
3)删除数据库链接
drop database link remotedb; --删除私有数据库链接
drop public database link remotedb; --删除公有数据库链接
9、分区表管理
使用分区(Partition)技术,oracle允许把一个大表分成几个部分,每一个部分叫一个分区,然后把每个部分存放在不同的物理磁盘,以提高这个数据库的性能。每个分区还可以再分为几份,这样产生的分区叫子分区(Subpartition),无论怎么划分,分区表逻辑上还是一个整体。
1)oracle提供如下几种分区方法:
- 范围分区(Range Partitioning):根据表中列值的范围将整个表分成不同的部分,如按照时间进行范围分区。
- 列表分区(List Partitioning):使用列表值将表划分成几个部分。
- 哈希分区(Hash Partitioning):使用哈希函数把表分成几个部分。
- 复合分区(Composite Partitioning):同时使用两种方法对表进行分区。
2)创建分区表
2.1)创建范围划分分区表:
create table people
( id number,
age int not null,
address varchar2(100)
)
Partition by range (age) --指定分区的方式,range表示为范围划分,按照年龄进行范围划分
(
Partition P1 values less then (10) --指定分区的名字和上限,最后一个分区可以使用maxvalue表示最大值
tablespace users, --指定分区存放的表空间,处于性能考虑,每个分区可以放在不同的表空间中
Partition P2 values less then (20)
tablespace myspace,
Partition P3 values less then (30)
tablespace users,
Partition P4 values less then (70)
tablespace myspace
);
2.2)创建哈希划分分区表:
create table people2(id number,age number)
Partition by hash(age) Partitions 4; --按照分区数量create table people3(id number,age number)
Partition by hash(age)
(
Partition Pt1 --指定分区
tablespace users,
Partition Pt2
tablespace myspace,
Partition Pt3
tablespace myspace,
Partition Pt4
tablespace users
);
2.3)创建列表划分分区表:
create table people4(name varchar(20), city varchar(20))
Partition by list (city)
(
Partition P1
values ('吉林','大连')
tablespace users1,
Partition P2
values ('成都','贵州')
tablespace users2,
Partition P3
values ('广州','桂林','台北')
tablespace users3
);
3)查询指定分区中的数据
select * from people4 partition(p2);
4)修改指定分区中的数据
update people4 partition(p2) set name='liujing' where name='刘晶';
5)删除指定分区中的数据
delete from people4 partition(p2) where name='liujing';
6)添加分区
6.1)往范围划分分区表中增加新的分区Pa:
alter table people add partition Pa values less then(90) tablespace users;
6.2)往哈希划分分区表中增加新的分区P_hash:
alter table people2 add partition P_hash tablespace myspace;
6.3)往列表划分分区表中增加新的分区P_list:
alter table people4 add partition P_list values('西宁','银川') tablespace myspace;
7)截断分区
alter table people truncate partition p1 --截断分区p1中的数据,会释放空间
delete from people partition p1 --不会释放空间
8)合并分区
8.1)合并范围划分的两个分区:
alter table people merge partition P1,P2 into partition P2;
8.2)合并列表划分的两个分区:
alter table people4 merge partition P1,P2 into partition P2;
注:不能合并按照哈希进行划分的两个分区。
9)拆分分区
9.1)拆分按照范围划分的分区:
alter table people split partition P2 AT (5) into (partition P1,partition P2);
9.2)拆分按照列表划分的分区:
alter table people4 split partition P3 values ('广州','桂林') into (partition P3_part1,partition P3_part2);
--'广州'和'桂林'落在第一个分区,剩下的值落在第二个分区
注:不能拆分按照哈希进行划分的分区。
10)重命名分区
alter table people4 rename partition P3_part1 to P3_part11;
11)交换分区
alter table people4 exchange partition P3_part11 with table t1;
12)删除分区
alter table people4 drop partition P3_part11;
10、视图
视图是表中数据的逻辑表示,视图对用户名、基表名、基表数据进行了封藏,它只是基表数据的展现“窗口”,视图的优点:加强了表的安全管理、隐藏了数据的复杂性、简化了SQL语句的书写。
1)视图的创建
create view v_zero as
select *
from kuser.studens_table
where id>1000
[with read only]; --加上with子句时表示只读视图(只允许被读)create replace procedure p_create_view --在存储过程中创建视图
is
sql_string varchar2(100);
begin
sql_string:='create view v_zero3 as select * from studens'; --创建视图的SLQ语句
execute immediate sql_string; --通过动态SQL创建视图
endexecute p_create_view; --执行存储过程
2)视图的使用
select * from v_zero; --视图查询
insert into v_zero values (1333,'kite'); --可以通过视图对基表数据进行修改(增、删、改),但不推荐
3)得到创建视图的sql语句
set serveroutput on; --设置环境变量
set long 100000;
select dbms_metadata.get_ddl('view','v_zero','item') from dual; --item是用户名/模式名
4)视图的删除
drop view v_zero [cascade constraints];
11、序列
oracle中通过序列实现字段的自增(sql server中通过identify直接标识自增列),序列又叫序列生成器,可以使用序列生成唯一键,每次访问序列,序列按照一定规律增加或减少。序列的定义存储在system表空间中,序列不像表,它不会占用磁盘空间。序列独立于事务,事务的提交和回滚都不会影响序列。
1)创建序列
语法:
create sequence 序列名字
increment by 整数 --指定序列的增量,可以为负数
start with 整数 --指定序列的起始值
maxvalue 整数 --指定序列的最大值
nomaxvalue --表示序列无最大值
minvalue 整数 --指定序列的最小值
nominvalue --表示序列无最小值
cycle --表示序列达到最大值后可以循环
nocycle --不能循环
cache 整数 --指定可以缓存多少个值在内存中,缓存的目的是加快对序列的访问(数据库重启后缓存中序列值将丢失!)
nocache --表示不缓存序列值
order --表示按照请求的顺序产生序列(可解决序列值丢失/不连续的问题)
noorder; --表示不按照请求的顺序产生序列
例子:
create sequence sq2
increment by 1
start with 1
nomaxvalue
nocycle
cache 10;
2)使用序列
select sq2.nextval from dual; --nextval使序列值增加
select sq2.currval from dual; --currval得到序列的当前值,注:每次只需currval之前必须执行nextval,否则会产生错误
3)删除序列
drop sequence sq2;
12、同义词
同义词又叫别名,一个同义词其实就是给一个对象(表、视图、序列等模式对象)起的别名,别名和对象的名字指向同一模式对象。目的是方便的引用模式对象。同义词的优点:隐藏对象的模式名、提高远程对象的透明性、简化SQL语句、限制用户直接对对象进行访问。同义词分为:
- 公有同义词(Public Synonym):数据库中的如何用户都可以使用公有同义词。
- 私有同义词(Private Synonym):被特定的用户所拥有,这个用户控制其他用户对私有同义词的使用。
1)创建同义词
create synonym ctb from itme.chinastudentbook@dblink6; --创建私有同义词
create public synonym pb_ctb from itme.chinastudentbook@dblink6; --创建公有同义词
2)删除同义词
drop synonym ctb; --删除私有同义词
drop public synonym pb_ctb; --删除公有同义词