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