數據庫——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 行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章