Oracle 事务和常用数据库对象
文章目录
一、事务
1、事务控制
1、使用commit 和rollback实现事务控制
commit:提交事务,即把事务中对数据库的修改进行永久保存
rollback:回滚事务,即取消对数据库所做的任何修改
SQL> insert into sales values('zhangsan','nan','haidian',90); //在sales表中插入数据
已创建 1 行。
SQL> col NAME for a10
SQL> col SEX for a10
SQL> col ADDRESS for a30
SQL> select * from sales; //查询sales表
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
已创建 1 行。
SQL> commit; //提交事务
提交完成。
SQL> select * from sales;
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
SQL> insert into sales values('zhoulan','nv','shenyang',88); //在sales表中插入数据
已创建 1 行。
SQL> rollback; //回滚
回退已完成。
SQL> select * from sales; //查询表发现数据并没有
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
2、使用autocommit实现事务的自动提交
SQL> set autocommit on; //自动提交
SQL> insert into sales values('lisi','nan','changping',70);
已创建 1 行。
提交完成。
SQL> select * from sales;
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
lisi nan changping 70
SQL> rollback;
回退已完成。
SQL> select * from sales;
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
lisi nan changping 70
3、程序异常退出对事务的影响
在事务执行过程中,程序会发生异常 如实例崩毁 断开连接等 此时事务结束并回滚所有的数据更改。
4、程序正常退出对事务的影响
在程序正常退出时,将提交所有的数据更改信息。
二、索引
1、索引的分类
1、B树索引
SQL> create index sales_name_index on sales(address); //对sales表的address列创建B树索引sales_address_index
索引已创建。
2、唯一索引和非唯一索引
唯—索引:保证定义索引的列中没有重复值。唯—索引中的索引关键字只能指向表中的—行 。
SQL> create unique index sales_name_unique_index on sales(name); //对sales表的name列创建唯一索引sales_name_unique_index
索引已创建。
非唯—索引:定义索引的列中可以有重复值
3、反向键索引
SQL> create index sales_reverse_index on sales(results) reverse; //重点是reverse
索引已创建。
4、位图索引
SQL> create bitmap index sales_bit_index on sales(sex); //重点是bitmap
索引已创建。
5、其他索引
基于函数的索引
SQL> create index sales_address_index on sales(upper(address)); //在sales中为address列创建大写函数索引
索引已创建。
SQL> select * from sales where UPPER(address)='HAIDIAN';
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
2、创建索引的原则
频繁搜索的列可以作为索引。
经常排序分组的列可以作为索引。
经常用作连接的列(主键/外键)可以作为索引。
将索引放在—个单独的表空间中 不要放在有回退段、临时段和表的表空间中。
对大型索引而言,考虑使用NOLOGGING子句创建。
根据业务数据发生的频率定期重新生成或重新组织索引以进行碎片整理。
不要在下面情况创建索引
仅包含几个不同值的列。
表中仅包含几行。
3、查看索引
SQL> col table_name for a20
SQL> col index_name for a30
SQL> select table_name,index_name from user_indexes where table_name='SALES'; //查找sales表的索引
TABLE_NAME INDEX_NAME
-------------------- ------------------------------
SALES SALES_NAME_INDEX //B树索引
SALES SALES_NAME_UNIQUE_INDEX //唯一索引
SALES SALES_REVERSE_INDEX //反向键索引
SALES SALES_BIT_INDEX //位图索引
SALES SALES_ADDRESS_INDEX //基于函数的索引
4、维护索引
SQL> alter index sales_address_index rebuild;
索引已更改。
5、删除索引
SQL> alter index sales_address_index coalesce;
索引已更改。
三、视图
优点
通过限制对表中预定的—组行和列的访间,视图提供了一种额外的安全性。
视图隐藏了数据的复杂性。
视图简化了用户的命令。
视图将应用程序与基表定义的修改隔离开来。
视图通过重命名列从另— 个角度(相对于基表)提供了数据而不影响基表,增强了数据库的灵活性 。
1、创建视图(普通)
CREATE [OR REPLACE] [FORCE I NOFORCE] VIEW view_name
[ (alias [, alias] ...)]
AS select_statement
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY);
SQL> create or replace view salesnv as select * from sales where sex='nv' with check option; //创建性别为女的视图
视图已创建。
SQL> insert into salesnv values('tom','nv','tianjing',100); //注意:条件为女才可以加入数据并同步到原表
已创建 1 行。
提交完成。
SQL> select * from sales;
NAME SEX ADDRESS RESULTS
---------- ---------- ------------------------------ ----------
zhangsan nan haidian 90
lisi nan changping 70
tom nv tianjing 100
OR REPLACE:如果视图已存在,此选项将重新创建该视图。
FORCE:如果使用此关键字,则无论基表是否存在,都将创建视图。
NOFORCE:这是默认值。如果使用此关键字,则仅当基表存在时才创建视图。
view_name:要创建的视图的名称。
alias:指定由视图的查询所选择的表达式或列的别名。别名的数目必须与视图所选择的表
达式的数目相匹配。
select_statement:SELECT 语句 。
WITHCHECK OPTION:此选项指定只能插入或更新视图可以访问的行。
WITH READ ONLY:此选项保证不能在此视图上执行任何修改操作。
2、查询视图
SQL> select view_name from user_views;
3、删除视图
SQL> drop view salesnv;
视图已删除。
4、物化视图
SQL> col name for a15
SQL> col type for a10
SQL> col value for a35
SQL> show parameter query rewrite enabled; //查询重写
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
inmemory_query string ENABLE
query_rewrite_enabled string TRUE
query_rewrite_integrity string enforced
创建物化视图的条件
SQL> create user c##scott identified by 123456 default tablespace users
2 temporary tablespace temp quota unlimited on users;
用户已创建。
SQL> grant connect,resource to c##scott; //具备基本权限
授权成功。
SQL> grant create materialized view to c##scott; //具备创建物化视图的权限
授权成功。
SQL> grant query rewrite to c##scott; //具备物化视图写入的权限
授权成功。
SQL> grant create any table to c##scott; //具备创建表的权限
授权成功。
SQL> grant select any table to c##scott; //具备查询表的权限
授权成功。
创建物化视图日志
SQL> conn c##scott/123456;
已连接。
SQL> select table_name from user_all_tables; //查询表
TABLE_NAME
--------------------------------------------------------------------------------
BONUS
DEPT
EMP
SALGRADE
SQL> create table test(id int,name varchar(10),sex varchar(5)); //创建表
表已创建。
SQL> create materialized view log on test with rowid; //开启实体化视图日志功能
实体化视图日志已创建。
创建物化视图
SQL> create materialized view mt_test
2 build immediate //立即创建物化视图
3 refresh fast //刷新数据的类型选择fast类型
4 on commit //在基表有更新时提交并立即更新物化视图
5 with rowid //
6 as //定义后面的查询语句
7 select * from test where sex='nv'; //如果没有启用查询重写功能添加enable query rewrite
实体化视图已创建。
SQL> insert into test values ('1','zs','nan'); //插入数据
已创建 1 行。
SQL> insert into test values ('2','ls','nv'); //插入数据
已创建 1 行。
SQL> commit; //提交事务
提交完成。
SQL> select * from mt_test;
ID NAME SEX
---------- ------------------------------ ---------------
2 ls nv
删除物化视图
SQL> drop materialized view mt_test;
四、序列
1、创建和访问序列
创建序列
SQL> create sequence sale_seq
2 start with 1 // 指定要生成的第一个序列号
3 increment by 1 //用千指定序列号之间的间隔,其默认值为1。如果n为正值,则生成的序列将按升序排列,如果n为负值,则生成的序列将按降序排列
4 nomaxvalue
5 nocycle; //不会为加快访问速度而预先分配序列号
序列已创建。
访问序列
SQL> create table project(id int,name varchar2(10)); //创建表project
表已创建。
SQL> insert into project values(sale_seq.nextval,'zhangsan'); //向project表添加记录
已创建 1 行。
SQL> insert into project values(sale_seq.nextval,'lisi');
已创建 1 行。
SQL> select * from project;
ID NAME
---------- ------------------------------
1 zhangsan
2 lisi
SQL> select sale_seq.currval from dual; //查看序列的CURRVAL值
CURRVAL
----------
2
2、更改序列
SQL> alter sequence sale_seq
2 maxvalue 5000 //修改序列的最大值到5000
3 cycle;
序列已更改。
3、查看序列
SQL> select sequence_name,increment_by,cache_size from user_sequences where sequence_name='SALE_SEQ';
SEQUENCE_NAME
--------------------------------------------------------------------------------
INCREMENT_BY CACHE_SIZE
------------ ----------
SALE_SEQ
1 20
4、删除序列
SQL> drop sequence SALE_SEQ;
序列已删除。
五、同义词
1、创建私有同义词
创建私有同义词(私有同义词名称不可以与当前模式的对象名相同)
SQL> create synonym sy_t for c##scott.emp@orcl;
同义词已创建。
CREATE [OR REPLACE] SYNONYM [schema.]synonym_name FOR [schema.] object_name;
OR REPLACE:在同义词存在的情况下替换该同义词。
synonym_name:要创建的同义词的名称。
object_name:指定要为之创建同义词的对象虳名称
要在自身的模式创建私有同义词,用户必须拥有create synonym系统权限。要在其他用户模式创建私有同义词,用户必须拥有create any synonym系统权限
SQL> set line 120;
SQL> select * from sy_t; //访问当前实例c##scott.emp表
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- --------------- --------------- ---------- ------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- --------------- --------------- ---------- ------------ ---------- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择 14 行。
2、创建公有同义词
SQL> create user c##user1 identified by 123456;
CREATE [OR REPLACE] PUBLIC SYNONYM synonym_name FOR [schema.] object_name;
用户已创建。
SQL> grant connect to c##user1;
授权成功。
SQL> grant create public synonym to c##scott; //将创建公有同义词权限给scott
授权成功。
SQL> conn c##scott/123456;
已连接。
SQL> grant select on dept to c##user1; //将查询dept权限给c##user1
授权成功。
SQL> create public synonym public_sy_dept for dept; //创建公有同义词public_sy_dept作为c##scott用户dept表的别名
同义词已创建。
SQL> conn c##user1/123456
已连接。
SQL> select * from public_sy_dept;
DEPTNO DNAME LOC
---------- ------------------------------------------ ---------------------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
3、删除同义词
SQL> drop synonym system.sy_t; //删除私有同义词
同义词已删除。
SQL> drop public synonym public_sy_dept; //删除公有同义词
同义词已删除。
六、分区表
1、创建表并且分区,以age分区
SQL> conn c##scott/123456
已连接。
SQL> create table student
(
id number,
name varchar2(10),
age number)
partition by range (age)
(
partition p1 values less than (10),
partition p2 values less than (20),
partition p3 values less than (maxvalue)
);
表已创建。
SQL> insert into student values(1,'t1',8);
已创建 1 行。
SQL> insert into student values(2,'t2',9);
已创建 1 行。
SQL> insert into student values(3,'t3',15);
已创建 1 行。
SQL> insert into student values(4,'t4',18);
已创建 1 行。
SQL> insert into student values(5,'t5',50);
已创建 1 行。
2、分别查询p1,p2,p3的数据
SQL> select * from student partition(p1); //如果表里无数据则会报错
ID NAME AGE
---------- ------------------------------ ----------
1 t1 8
2 t2 9
SQL> select * from student partition(p2);
ID NAME AGE
---------- ------------------------------ ----------
3 t3 15
4 t4 18
SQL> select * from student partition(p3);
ID NAME AGE
---------- ------------------------------ ----------
5 t5 50
3、删除小于10岁的数据
SQL> delete from student partition(p1);
已删除 2 行。