Linux操作文档——Oracle 事务和常用数据库对象

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 行。

猜你喜欢

转载自blog.csdn.net/g950904/article/details/106252760