oracle數(shù)據(jù)庫數(shù)據(jù)對(duì)象中最基本的是表和視圖,其他還有約束、序列、函數(shù)、存儲(chǔ)過程、包、觸發(fā)器等。對(duì)數(shù)據(jù)庫的操作可以基本歸結(jié)為對(duì)數(shù)據(jù)對(duì)象的操作,理解和掌握oracle數(shù)據(jù)庫對(duì)象是學(xué)習(xí)oracle的捷徑。
表和視圖
oracle中表是數(shù)據(jù)存儲(chǔ)的基本結(jié)構(gòu)。oracle8引入了分區(qū)表和對(duì)象表,oracle8i引入了臨時(shí)表,使表的功能更強(qiáng)大。視圖是一個(gè)或多個(gè)表中數(shù)據(jù)的邏輯表達(dá)式。本文我們將討論怎樣創(chuàng)建和管理簡(jiǎn)單的表和視圖。
管理表
表可以看作有行和列的電子數(shù)據(jù)表,表是關(guān)系數(shù)據(jù)庫中一種擁有數(shù)據(jù)的結(jié)構(gòu)。用create table語句建立表,在建立表的同時(shí),必須定義表名,列,以及列的數(shù)據(jù)類型和大小。例如:
create table products
( prod_id number(4),
prod_name vaechar2(20),
stock_qty number(5,3)
);
這樣我們就建立了一個(gè)名為products的表, 關(guān)鍵詞create table后緊跟的表名,然后定義了三列,同時(shí)規(guī)定了列的數(shù)據(jù)類型和大小。
在創(chuàng)建表的同時(shí)你可以規(guī)定表的完整性約束,也可以規(guī)定列的完整性約束,在列上普通的約束是not null,關(guān)于約束的討論我們?cè)谝院筮M(jìn)行。
在建立或更改表時(shí),可以給表一個(gè)缺省值。缺省值是在增加行時(shí),增加的數(shù)據(jù)行中某一項(xiàng)值為null時(shí),oracle即認(rèn)為該值為缺省值。
下列數(shù)據(jù)字典視圖提供表和表的列的信息:
. dba_tables
. dba_all_tables
. user_tables
. user_all_tables
. all_tables
. all_all_tables
. dba_tab_columns
. user_tab_columns
. all_tab_columns
表的命名規(guī)則
表名標(biāo)識(shí)一個(gè)表,所以應(yīng)盡可能在表名中描述表,oracle中表名或列名最長(zhǎng)可以達(dá)30個(gè)字符串。表名應(yīng)該以字母開始,可以在表名中包含數(shù)字、下劃線、#、$等。
從其它表中建立表
可以使用查詢從基于一個(gè)或多個(gè)表中建立表,表的列的數(shù)據(jù)類型和大小有查詢結(jié)果決定。建立這種形式的表的查詢可以選擇其他表中所有的列或者只選擇部分列。在create table語句中使用關(guān)鍵字as,例如:
sql>create table emp as select * from employee
table created
sql> create table y as select * from x where no=2
需要注意的是如果查詢涉及l(fā)ong數(shù)據(jù)類型,那么create table....as select....將不會(huì)工作。
更改表定義
在建立表后,有時(shí)候我們可能需要修改表,比如更改列的定義,更改缺省值,增加新列,刪除列等等。oracle使用alter table語句來更改表的定義
1、增加列
語法:
alter table [schema.] table_name add column_definition
例:
alter table orders add order_date date;
table alter
對(duì)于已經(jīng)存在的數(shù)據(jù)行,新列的值將是null.
2、更改列
語法:
alter table [schema.] table_name modify column_name new_attributes;
例:
alter table orders modity (quantity number(10,3),status varchar2(15));
這個(gè)例子中我們修改了表orders,將status列的長(zhǎng)度增加到15,將quantity列減小到10,3;
修改列的規(guī)則如下:
. 可以增加字符串?dāng)?shù)據(jù)類型的列的長(zhǎng)度,數(shù)字?jǐn)?shù)據(jù)類型列的精度。
. 減少列的長(zhǎng)度時(shí),該列應(yīng)該不包含任何值,所有數(shù)據(jù)行都為null.
. 改變數(shù)據(jù)類型時(shí),該列的值必須是null.
. 對(duì)于十進(jìn)制數(shù)字,可以增加或減少但不能降低他的精度。
3、刪除數(shù)據(jù)列
優(yōu)化oracle數(shù)據(jù)庫,唯一的方法是刪除列,重新建立數(shù)據(jù)庫。在oracle8i中有很多方法刪除列,你可以刪除未用數(shù)據(jù)列或者可以標(biāo)示該列為未用數(shù)據(jù)列然后刪除。
刪除數(shù)據(jù)列的語法是:
alter table [schema.] table_name drop {colum column_names | (column_names)}[cascade constrains]
要注意的是在刪除列時(shí)關(guān)于該列的索引和完整性約束也同時(shí)刪除。注意關(guān)鍵字cascade constrains,如果刪除的列是多列約束的一部分,那么這個(gè)約束條件相對(duì)于其他列也同時(shí)刪除。
如果用戶擔(dān)心在大型數(shù)據(jù)庫中刪除列要花太多時(shí)間,可以先將他們標(biāo)記為未用數(shù)據(jù)列,標(biāo)記未用數(shù)據(jù)列的語法如下:
alter table [schema.] table_name set unused {colum column_names | (column_names)}[cascade constrains]
這個(gè)語句將一個(gè)或多個(gè)數(shù)據(jù)列標(biāo)記為未用數(shù)據(jù)列,但并不刪除數(shù)據(jù)列中的數(shù)據(jù),也不釋放占用的磁盤空間。但是,未用數(shù)據(jù)列在視圖和數(shù)據(jù)字典中并不顯示,并且該數(shù)據(jù)列的名稱將被刪除,新的數(shù)據(jù)列可以使用這個(gè)名稱。基于該數(shù)據(jù)列的索引、約束,統(tǒng)計(jì)等都將被刪除。
刪除未用數(shù)據(jù)列的語句是:
alter table [schema.] table_name drop {unused colum | column continue} 刪除表和更改表名
刪除表非常簡(jiǎn)單,但它是一個(gè)不可逆轉(zhuǎn)的行為。
語法:
drop table [schema.] table_name [cascade constraints]
刪除表后,表上的索引、觸發(fā)器、權(quán)限、完整性約束也同時(shí)刪除。oracle不能刪除視圖,或其他程序單元,但oracle將標(biāo)示他們無效。如果刪除的表涉及引用主鍵或唯一關(guān)鍵字的完整性約束時(shí),那么drop table語句就必須包含cascade constraints子串。
更改表名
rename命令用于給表和其他數(shù)據(jù)庫對(duì)象改名。oracle系統(tǒng)自動(dòng)將基于舊表的完整性約束、索引、權(quán)限轉(zhuǎn)移到新表中。oracle同時(shí)使所有基于舊表的數(shù)據(jù)庫對(duì)象,比如視圖、程序、函數(shù)等,為不合法。
語法:
rename old_name to new_name;
例:
sql> rename orders to purchase_orders;
table renamed
截短表
truncate命令與drop命令相似, 但他不是刪除整個(gè)數(shù)據(jù)表,所以索引、完整性約束、觸發(fā)器、權(quán)限等都不會(huì)被刪除。缺省情況下將釋放部分表和視圖空間,如果用戶不希望釋放表空間,truncate語句中要包含reuse storage子串。truncate命令語法如下:
truncate {table|cluster} [schema.] name {drop|reuse storage}
例:
sql> truncate table t1;
table truncate.
管理視圖
視圖是一個(gè)或多個(gè)表中的數(shù)據(jù)的簡(jiǎn)化描述,用戶可以將視圖看成一個(gè)存儲(chǔ)查詢(stored query)或一個(gè)虛擬表(virtual table).查詢僅僅存儲(chǔ)在oracle數(shù)據(jù)字典中,實(shí)際的數(shù)據(jù)沒有存放在任何其它地方,所以建立視圖不用消耗其他的空間。視圖也可以隱藏復(fù)雜查詢,比如多表查詢,但用戶只能看見視圖。視圖可以有與他所基于表的列名不同的列名。用戶可以建立限制其他用戶訪問的視圖。
建立視圖
create view命令創(chuàng)建視圖,定義視圖的查詢可以建立在一個(gè)或多個(gè)表,或其他視圖上。查詢不能有for update子串,在早期的oracle8i版本中不支持order by子串,現(xiàn)在的版本中create view可以擁有order by子串。
例:
sql> create view top_emp as
select empno employee_id,ename employee_name,salary
from emp
where salary >2000
用戶可以在創(chuàng)建視圖的同時(shí)更改列名,方法是在視圖名后立即加上要命名的列名。重新定義視圖需要包含or replace子串。
sql> create view top_emp
(employee_id,employee_name,salary) as
select empno ,ename ,salary
from emp
where salary >2000
如果在創(chuàng)建的視圖包含錯(cuò)誤在正常情況下,視圖將不會(huì)被創(chuàng)建。但如果你需要?jiǎng)?chuàng)建一個(gè)帶錯(cuò)誤的視圖必須在create view語句中帶上force選項(xiàng)。如:
create force view order_status as
select * from purchase_orders
where status=apppove;
sql>/
warning :view create with compilation errors
這樣將創(chuàng)建了一個(gè)名為order_status的視圖,但這樣的視圖的狀態(tài)是不合法的,如果以后狀態(tài)發(fā)生變化則可以重新編譯,其狀態(tài)也變成合法的。
從視圖中獲得數(shù)據(jù)
從視圖中獲得數(shù)據(jù)與從表中獲得數(shù)據(jù)基本一樣,用戶可以在連接和子查詢中使用視圖,也可以使用sql函數(shù),以及所有select語句的字串。
插入、更新、刪除數(shù)據(jù)
用戶在一定的限制條件下可以通過視圖更新、插入、刪除數(shù)據(jù)。如果視圖連接多個(gè)表,那么在一個(gè)時(shí)間里只能更新一個(gè)表。所有的能被更新的列可以在數(shù)據(jù)字典user_updatetable_columns中查到。
用戶在create view中可以使用了with子串。with read only子串表示創(chuàng)建的視圖是一個(gè)只讀視圖,不能進(jìn)行更新、插入、刪除操作。with check option表示可以進(jìn)行插入和更新操作,但應(yīng)該滿足where子串的條件。這個(gè)條件就是創(chuàng)建視圖where子句的條件,比如在上面的例子中用戶創(chuàng)建了一個(gè)視圖top_emp,在這個(gè)視圖中用戶不能插入salary小于2000的數(shù)據(jù)行。
刪除視圖
刪除視圖使用drop view命令。同時(shí)將視圖定義從數(shù)據(jù)字典中刪除,基于視圖的權(quán)限也同時(shí)被刪除,其他涉及到該視圖的函數(shù)、視圖、程序等都將被視為非法。
例:
drop view top_emp;
完整性約束
完整性約束用于增強(qiáng)數(shù)據(jù)的完整性,oracle提供了5種完整性約束:
check
not null
unique
primary
foreign key
完整性約束是一種規(guī)則,不占用任何數(shù)據(jù)庫空間。完整性約束存在數(shù)據(jù)字典中,在執(zhí)行sql或pl/sql期間使用。用戶可以指明約束是啟用的還是禁用的,當(dāng)約束啟用時(shí),他增強(qiáng)了數(shù)據(jù)的完整性,否則,則反之,但約束始終存在于數(shù)據(jù)字典中。
禁用約束,使用alter語句
alter table table_name disable constraint constraint_name;
或
alter table policies disable constraint chk_gender
如果要重新啟用約束:
alter table policies enable constraint chk_gender
刪除約束
alter table table_name drop constraint constraint_name
或
alter table policies drop constraint chk_gender;
check 約束
在數(shù)據(jù)列上check 約束需要 一個(gè)特殊的布爾條件或者將數(shù)據(jù)列設(shè)置成true,至少一個(gè)數(shù)據(jù)列的值是null,check約束用于增強(qiáng)表中數(shù)據(jù)內(nèi)容的簡(jiǎn)單的商業(yè)規(guī)則。用戶使用check約束保證數(shù)據(jù)規(guī)則的一致性。check約束可以涉及該行同屬check約束的其他數(shù)據(jù)列但不能涉及其他行或其他表,或調(diào)用函數(shù)sysdate,uid,user,userenv。如果用戶的商業(yè)規(guī)則需要這類的數(shù)據(jù)檢查,那么可以使用觸發(fā)器。check約束不保護(hù)lob數(shù)據(jù)類型的數(shù)據(jù)列和對(duì)象、嵌套表、varry、ref等。單一數(shù)據(jù)列可以有多個(gè)check約束保護(hù),一個(gè)check約束可以保護(hù)多個(gè)數(shù)據(jù)列。
創(chuàng)建表的check約束使用create table語句,更改表的約束使用alter table語句。
語法:
constraint [constraint_name] check (condition);
check約束可以被創(chuàng)建或增加為一個(gè)表約束,當(dāng)check約束保護(hù)多個(gè)數(shù)據(jù)列時(shí),必須使用表約束語法。約束名是可選的并且如果這個(gè)名字不存在,那么oracle將產(chǎn)生一個(gè)以sys_開始的唯一的名字。
例:
create table policies
(policy_id number,
holder_name varchar2(40),
gender varchar2(1) constraint chk_gender check (gender in (m,f),
marital_status varchar2(1),
date_of_birth date,
constraint chk_marital check (marital_status in(s,m,d,w))
);
not null約束
not null約束應(yīng)用在單一的數(shù)據(jù)列上,并且他保護(hù)的數(shù)據(jù)列必須要有數(shù)據(jù)值。缺省狀況下,oracle允許任何列都可以有null值。某些商業(yè)規(guī)則要求某數(shù)據(jù)列必須要有值,not null約束將確保該列的所有數(shù)據(jù)行都有值。
例:
create table policies
(policy_id number,
holder_name varchar2(40) not null,
gender varchar2(1),
marital_status varchar2(1),
date_of_birth date not null
);
對(duì)于not null的alter table語句與其他約束稍微有點(diǎn)不同。
alter table policies modify holder_name not null
唯一性約束(unique constraint)
唯一性約束可以保護(hù)表中多個(gè)數(shù)據(jù)列,保證在保護(hù)的數(shù)據(jù)列中任何兩行的數(shù)據(jù)都不相同。唯一性約束與表一起創(chuàng)建,在唯一性約束創(chuàng)建后,可以使用alter table語句修改。
語法:
column_name data_type constraint constraint_name unique
如果唯一性約束保護(hù)多個(gè)數(shù)據(jù)列,那么唯一性約束要作為表約束增加。語法如下:
constraint constraint_name (column) unique using index tablespace (tablespace_name) storage (stored clause)
唯一性約束由一個(gè)b-tree索引增強(qiáng),所以可以在using子串中為索引使用特殊特征,比如表空間或存儲(chǔ)參數(shù)。create table語句在創(chuàng)建唯一性約束的同時(shí)也給目標(biāo)數(shù)據(jù)列建立了一個(gè)唯一的索引。
create table insured_autos
(policy_id number constraint pk_policies primary key,
vin varchar2(10),
coverage_begin date,
coverage_term number,
constrain unique_auto unique (policy_id,vin) using index tablespace index storage (initial 1m next 10m pctincrease 0)
);
用戶可以禁用未以性約束,但他仍然存在,禁用唯一性約束使用alter table 語句
alter table insured_autos disable constrain unique_name;
刪除唯一性約束,使用alter table....drop constrain語句
alter table insured_autos drop constrain unique_name;
注意用戶不能刪除在有外部鍵指向的表的唯一性約束。這種情況下用戶必須首先禁用或刪除外部鍵(foreign key)。
刪除或禁用唯一性約束通常同時(shí)刪除相關(guān)聯(lián)的唯一索引,因而降低了數(shù)據(jù)庫性能。經(jīng)常刪除或禁用唯一性約束有可能導(dǎo)致丟失索引帶來的性能錯(cuò)誤。要避免這樣錯(cuò)誤,可以采取下面的步驟:
1、在唯一性約束保護(hù)的數(shù)據(jù)列上創(chuàng)建非唯一性索引。
2、添加唯一性約束
主鍵(primary key)約束
表有唯一的主鍵約束。表的主鍵可以保護(hù)一個(gè)或多個(gè)列,主鍵約束可與not null約束共同作用于每一數(shù)據(jù)列。not null約束和唯一性約束的組合將保證主鍵唯一地標(biāo)識(shí)每一行。像唯一性約束一樣,主鍵由b-tree索引增強(qiáng)。
創(chuàng)建主鍵約束使用create table語句與表一起創(chuàng)建,如果表已經(jīng)創(chuàng)建了,可以使用alter table語句。
create table policies
(policy_id number constraint pk_policies primary key,
holder_name varchar2(40),
gender varchar2(1),
marital_status varchar2(1),
date_of_birth date
);
與唯一性約束一樣,如果主鍵約束保護(hù)多個(gè)數(shù)據(jù)列,那么必須作為一個(gè)表約束創(chuàng)建。
create table insured_autos
(policy_id number,
vin varchar2(40),
coverage_begin date,
coverage_term number,
constraint pk_insured_autos primary key (policy_id,vin)
using index tablespace index
storage (initial 1m next 10m pctincrease 0)
);
禁用或刪除主鍵必須與alter table 語句一起使用
alter table policies drop primary key;
或
alter table policies disable primary key;
外部鍵約束(foreign key constraint)
外部鍵約束保護(hù)一個(gè)或多個(gè)數(shù)據(jù)列,保證每個(gè)數(shù)據(jù)行的數(shù)據(jù)包含一個(gè)或多個(gè)null值,或者在保護(hù)的數(shù)據(jù)列上同時(shí)擁有主鍵約束或唯一性約束。引用(主鍵或唯一性約束)約束可以保護(hù)同一個(gè)表,也可以保護(hù)不同的表。與主鍵和唯一性約束不同外部鍵不會(huì)隱式建立一個(gè)b-tree索引。在處理外部鍵時(shí),我們常常使用術(shù)語父表(parent table)和子表(child table),父表表示被引用主鍵或唯一性約束的表,子表表示引用主鍵和唯一性約束的表。
創(chuàng)建外部鍵使用create table語句,如果表已經(jīng)建立了,那么使用alter table語句。
create table insured_autos
(policy_id number constraint policy_fk
reference policies(policy_id
on delete cascade,
vin varchar2(40),
coverage_begin date,
coverage_term number,
make varchar2(30),
model varchar(30),
year number,
constrain auto_fk froeign key (make,model,year)
references automobiles (make,model,year)
on delete set null
);
on delete子串告訴oracle如果父紀(jì)錄(parent record)被刪除后,子記錄做什么。缺省情況下禁止在子記錄還存在的情況下刪除父紀(jì)錄。
外部鍵和null值
在外部鍵約束保護(hù)的數(shù)據(jù)列中null值的處理可能產(chǎn)生不可預(yù)料的結(jié)果。oracle 使用iso standar match none規(guī)則增強(qiáng)外部鍵約束。這個(gè)規(guī)則規(guī)定如果任何外部鍵作用的數(shù)據(jù)列包含有一個(gè)null值,那么任何保留該鍵的數(shù)據(jù)列在父表中沒有匹配值。
比如,在父表automobiles中,主鍵作用于數(shù)據(jù)列make,model,year上,用戶使用的表insured_autos有一個(gè)外部約束指向aotomobiles,注意在insures_autos中有一數(shù)據(jù)行的model列為null值,這一行數(shù)據(jù)已經(jīng)通過約束檢查,即使make列也沒有顯示在父表automobiles中,如下表:
表1 automobiles
make model year ford taurus 2000 toyota camry 1999
表2 insured_autos
policy_id make model year 576 ford taurus 2000 577 toyota camry 1999 578 tucker null 1949
延遲約束檢驗(yàn)(deferred constraint checking)
約束檢驗(yàn)分兩種情況,一種是在每一條語句結(jié)束后檢驗(yàn)數(shù)據(jù)是否滿足約束條件,這種檢驗(yàn)稱為立即約束檢驗(yàn)(immediately checking),另一種是在事務(wù)處理完成之后對(duì)數(shù)據(jù)進(jìn)行檢驗(yàn)稱之為延遲約束檢驗(yàn)。在缺省情況下oracle約束檢驗(yàn)是立即檢驗(yàn)(immediately checking),如果不滿足約束將先是一條錯(cuò)誤信息,但用戶可以通過set constraint語句選擇延遲約束檢驗(yàn)。語法如下:
set constraint constraint_name|all defeerred|immediate --;
序列(sequences)
oracle序列是一個(gè)連續(xù)的數(shù)字生成器。序列常用于人為的關(guān)鍵字,或給數(shù)據(jù)行排序否則數(shù)據(jù)行是無序的。像約束一樣,序列只存在于數(shù)據(jù)字典中。序列號(hào)可以被設(shè)置為上升、下降,可以沒有限制或重復(fù)使用直到一個(gè)限制值。創(chuàng)建序列使用set sequence語句。
create sequence [schema] sequence keyword
keyword包括下面的值:
keyword 描述 start with 定義序列生成的第一個(gè)數(shù)字,缺省為1 increment by 定義序列號(hào)是上升還是下降,對(duì)于一個(gè)降序的序列increment by為負(fù)值 minvalue 定義序列可以生成的最小值,這是降序序列中的限制值。缺省情況下該值為nominvalue,nominvalue,對(duì)于升序?yàn)?,對(duì)于降序?yàn)?10e26. maxvalue 序列能生成的最大數(shù)字。這是升序序列中的限制值,缺省的maxvalue為nomaxvalue,nomaxvalue,對(duì)于升序?yàn)?0e26,對(duì)于降序?yàn)?1。 cycle 設(shè)置序列值在達(dá)到限制值以后可以重復(fù) nocycle 設(shè)置序列值在達(dá)到限制值以后不能重復(fù),這是缺省設(shè)置。當(dāng)試圖產(chǎn)生maxvalue+1的值時(shí),將會(huì)產(chǎn)生一個(gè)異常 cache 定義序列值占據(jù)的內(nèi)存塊的大小,缺省值為20 nocache 在每次序列號(hào)產(chǎn)生時(shí)強(qiáng)制數(shù)據(jù)字典更新,保證在序列值之間沒有間隔當(dāng)創(chuàng)建序列時(shí),start with值必須等于或大于minvalue。
刪除序列使用drop sequence語句
drop sequence sequence_name
索引(indexes)
索引是一種可以提高查詢性能的數(shù)據(jù)結(jié)構(gòu),在這一部分我們將討論索引如何提高查詢性能的。oracle提供了以下幾種索引:
b-tree、哈希(hash)、位圖(bitmap)等索引類型
基于原始表的索引
基于函數(shù)的索引
域(domain)索引
實(shí)際應(yīng)用中主要是b-tree索引和位圖索引,所以我們將集中討論這兩種索引類型。
b-tree索引
b-tree索引是最普通的索引,缺省條件下建立的索引就是這種類型的索引。b-tree索引可以是唯一或非唯一的,可以是單一的(基于一列)或連接的(多列)。b-tree索引在檢索高基數(shù)數(shù)據(jù)列(高基數(shù)數(shù)據(jù)列是指該列有很多不同的值)時(shí)提供了最好的性能。對(duì)于取出較小的數(shù)據(jù)b-tree索引比全表檢索提供了更有效的方法。但當(dāng)檢查的范圍超過表的10%時(shí)就不能提高取回?cái)?shù)據(jù)的性能。正如名字所暗示的那樣,b-tree索引是基于二元樹的,由枝干塊(branch block)和樹葉塊(leaf block)組成,枝干塊包含了索引列(關(guān)鍵字)和另一索引的地址。樹葉塊包含了關(guān)鍵字和給表中每個(gè)匹配行的rowid。
位圖索引
位圖索引主要用于決策支持系統(tǒng)或靜態(tài)數(shù)據(jù),不支持行級(jí)鎖定。位圖索引可以是簡(jiǎn)單的(單列)也可以是連接的(多列),但在實(shí)踐中絕大多數(shù)是簡(jiǎn)單的。位圖索引最好用于低到中群集(cardinality)列,在這些列上多位圖索引可以與and或or操作符結(jié)合使用。位圖索引使用位圖作為鍵值,對(duì)于表中的每一數(shù)據(jù)行位圖包含了true(1)、false(0)、或null值。位圖索引的位圖存放在b-tree結(jié)構(gòu)的頁節(jié)點(diǎn)中。b-tree結(jié)構(gòu)使查找位圖非常方便和快速。另外,位圖以一種壓縮格式存放,因此占用的磁盤空間比b-tree索引要小得多。
同義詞(synonyms)
對(duì)另一個(gè)數(shù)據(jù)對(duì)象而言同義詞是一個(gè)別名。public同義詞是針對(duì)所有用戶的,相對(duì)而言private同義詞則只針對(duì)對(duì)象擁有者或被授予權(quán)限的賬戶。在本地?cái)?shù)據(jù)庫中同義詞可以表示表、視圖、序列、程序、函數(shù)或包等數(shù)據(jù)對(duì)象,也可以通過鏈接表示另一個(gè)數(shù)據(jù)庫的對(duì)象。
創(chuàng)建同義詞語法如下:
create [public] synonym synonym_name for [schema.] object[@db_link];
例:
create public synonym policies for poladm.policies@prod;
create synonym plan_table for system.plan_table;
過程和函數(shù)
過程和函數(shù)都以編譯后的形式存放在數(shù)據(jù)庫中,函數(shù)可以沒有參數(shù)也可以有多個(gè)參數(shù)并有一個(gè)返回值。過程有零個(gè)或多個(gè)參數(shù),沒有返回值。函數(shù)和過程都可以通過參數(shù)列表接收或返回零個(gè)或多個(gè)值,函數(shù)和過程的主要區(qū)別不在于返回值,而在于他們的調(diào)用方式。過程是作為一個(gè)獨(dú)立執(zhí)行語句調(diào)用的:
pay_involume(invoice_nbr,30,due_date);
函數(shù)以合法的表達(dá)式的方式調(diào)用:
order_volumn:=open_orders(sysdate,30);
創(chuàng)建過程的語法如下:
create [ or replace] procedure [schema.]procedure_name
[parameter_lister]
{as|is}
declaration_section
begin
executable_section
[exception
exception_section]
end [procedure_name]
每個(gè)參數(shù)的語法如下:
paramter_name mode datatype [(:=|default) value]
mode有三種形式:in、out、inout。
in表示在調(diào)用過程的時(shí)候,實(shí)際參數(shù)的取值被傳遞給該過程,形式參數(shù)被認(rèn)為是只讀的,當(dāng)過程結(jié)束時(shí),控制會(huì)返回控制環(huán)境,實(shí)際參數(shù)的值不會(huì)改變。
out在調(diào)用過程時(shí)實(shí)際參數(shù)的取值都將被忽略,在過程內(nèi)部形式參數(shù)只能是被賦值,而不能從中讀取數(shù)據(jù),在過程結(jié)束后形式參數(shù)的內(nèi)容將被賦予實(shí)際參數(shù)。
inout這種模式是in和out的組合;在過程內(nèi)部實(shí)際參數(shù)的值會(huì)傳遞給形式參數(shù),形勢(shì)參數(shù)的值可讀也可寫,過程結(jié)束后,形勢(shì)參數(shù)的值將賦予實(shí)際參數(shù)。
創(chuàng)建函數(shù)的語法和過程的語法基本相同,唯一的區(qū)別在于函數(shù)有returen子句
create [ or replace] finction [schema.]function_name
[parameter_list]
return returning_datatype
{as|is}
declaration_section
begin
executable_section
[exception]
exception_section
end [procedure_name]
在執(zhí)行部分函數(shù)必須有喲個(gè)或多個(gè)return語句。
在創(chuàng)建函數(shù)中可以調(diào)用單行函數(shù)和組函數(shù),例如:
create or replace function my_sin(degreesin in number)
return number
is
pi number=acos(-1);
radiansperdegree number;
begin
radiansperdegree=pi/180;
return(sin(degreesin*radiansperdegree));
end
包
包是一種將過程、函數(shù)和數(shù)據(jù)結(jié)構(gòu)捆綁在一起的容器;包由兩個(gè)部分組成:外部可視包規(guī)范,包括函數(shù)頭,過程頭,和外部可視數(shù)據(jù)結(jié)構(gòu);另一部分是包主體(package body),包主體包含了所有被捆綁的過程和函數(shù)的聲明、執(zhí)行、異常處理部分。
打包的pl/sql程序和沒有打包的有很大的差異,包數(shù)據(jù)在用戶的整個(gè)會(huì)話期間都一直存在,當(dāng)用戶獲得包的執(zhí)行授權(quán)時(shí),就等于獲得包規(guī)范中的所有程序和數(shù)據(jù)結(jié)構(gòu)的權(quán)限。但不能只對(duì)包中的某一個(gè)函數(shù)或過程進(jìn)行授權(quán)。包可以重載過程和函數(shù),在包內(nèi)可以用同一個(gè)名字聲明多個(gè)程序,在運(yùn)行時(shí)根據(jù)參數(shù)的數(shù)目和數(shù)據(jù)類型調(diào)用正確的程序。
創(chuàng)建包必須首先創(chuàng)建包規(guī)范,創(chuàng)建包規(guī)范的語法如下:
create [or replace] package package_name
{as|is}
public_variable_declarations |
public_type_declarations |
public_exception_declarations |
public_cursor_declarations |
function_declarations |
procedure_specifications
end [package_name]
創(chuàng)建包主體使用create package body語句:
create [or replace] package body package_name
{as|is}
private_variable_declarations |
private_type_declarations |
private_exception_declarations |
private_cursor_declarations |
function_declarations |
procedure_specifications
end [package_name]
私有數(shù)據(jù)結(jié)構(gòu)是那些在包主體內(nèi)部,對(duì)被調(diào)用程序而言是不可見的。
觸發(fā)器(triggers)
觸發(fā)器是一種自動(dòng)執(zhí)行響應(yīng)數(shù)據(jù)庫變化的程序。可以設(shè)置為在觸發(fā)器事件之前或之后觸發(fā)或執(zhí)行。能夠觸發(fā)觸發(fā)器事件的事件包括下面幾種:
dml事件
ddl事件
數(shù)據(jù)庫事件
dml事件觸發(fā)器可以是語句或行級(jí)觸發(fā)器。dml語句觸發(fā)器在觸發(fā)語句之前或之后觸發(fā)dml行級(jí)觸發(fā)器在語句影響的行變化之前或之后觸發(fā)。用戶可以給單一事件和類型定義多個(gè)觸發(fā)器,但沒有任何方法可以增強(qiáng)多觸發(fā)器觸發(fā)的命令。下表列出了用戶可以利用的觸發(fā)器事件:
事件 觸發(fā)器描述 insert 當(dāng)向表或視圖插入一行時(shí)觸發(fā)觸發(fā)器 update 更新表或視圖中的某一行時(shí)觸發(fā)觸發(fā)器 delete 從表或視圖中刪除某一行時(shí)觸發(fā)觸發(fā)器 create 當(dāng)使用create語句為數(shù)據(jù)庫或項(xiàng)目增加一個(gè)對(duì)象時(shí)觸發(fā)觸發(fā)器 alter 當(dāng)使用alter語句為更改一個(gè)數(shù)據(jù)庫或項(xiàng)目的對(duì)象時(shí)觸發(fā)觸發(fā)器 drop 當(dāng)使用drop語句刪除一個(gè)數(shù)據(jù)庫或項(xiàng)目的對(duì)象時(shí)觸發(fā)觸發(fā)器 start 打開數(shù)據(jù)庫時(shí)觸發(fā)觸發(fā)器,在事件后觸發(fā) shutdown 關(guān)閉數(shù)據(jù)庫時(shí)觸發(fā),事件前觸發(fā) logon 當(dāng)一個(gè)會(huì)話建立時(shí)觸發(fā),事件前觸發(fā) logoff 當(dāng)關(guān)閉會(huì)話時(shí)觸發(fā),事件前觸發(fā) server 服務(wù)器錯(cuò)誤發(fā)生時(shí)觸發(fā)觸發(fā)器,事件后觸發(fā)
創(chuàng)建觸發(fā)器的語法如下:
create [or replace] trigger trigger_name
{before|after|instead of} event
on {table_or_view_name|database}
[for each row[when condition]]
trigger_body
只有dml觸發(fā)器(insert、update、delete)語句可以使用instead of觸發(fā)器并且只有表的dml觸發(fā)器可以是before或after觸發(fā)器。
象約束一樣觸發(fā)器可以被設(shè)置為禁用或啟用來關(guān)閉或打開他們的執(zhí)行體(execute),將觸發(fā)器設(shè)置為禁用或啟用使用alter trigger語句:
alter trigger trigger_name enable;
alter trigger trigger_name disable;
要禁用或啟用表的所有觸發(fā)器,使用alter table語句
alter trigger table_name disable all trigger;
alter trigger table_name enable all trigger;
刪除觸發(fā)器使用drop trigger
drop trigger trigger_name;
數(shù)據(jù)字典
oracle數(shù)據(jù)字典包含了用戶數(shù)據(jù)庫的元數(shù)據(jù)。帶下劃線的表名稱中帶obj$、uet$、source$,這些表是在執(zhí)行create database語句期間由sql.bsq腳本創(chuàng)建的,一般情況下用戶很少訪問這些表。腳本catalog.sql(通常位于$oracle_home/rdbms/admin)在create database語句之后立即運(yùn)行,創(chuàng)建數(shù)據(jù)字典視圖。
數(shù)據(jù)字典視圖大致可以分為三類:
.前綴為user_的數(shù)據(jù)字典視圖,包含了用戶擁有的對(duì)象的信息。
.前綴為all_的數(shù)據(jù)字典視圖,包含了用戶當(dāng)前可以訪問的全部對(duì)象和權(quán)限的信息。
.前綴為dba_的數(shù)據(jù)字典視圖,包含了數(shù)據(jù)庫擁有的所有對(duì)象和權(quán)限的信息。
在絕大多數(shù)數(shù)據(jù)字典視圖中都有象dba_tables,all_tables和user_tables這樣的視圖家族。oracle中有超過100個(gè)視圖家族,所以要全面介紹這些視圖家族是單調(diào)乏味的而且沒有多大的意義。在下表中列出了最重要和最常用的視圖家族,需要注意的是每個(gè)視圖家族都有一個(gè)dba_,一個(gè)all_一個(gè)user_視圖。
視圖家族(view family) 描述 col_privs 包含了表的列權(quán)限,包括授予者、被授予者和權(quán)限 extents 數(shù)據(jù)范圍信息,比如數(shù)據(jù)文件,數(shù)據(jù)段名(segment_name)和大小 indexes 索引信息,比如類型、唯一性和被涉及的表 ind_columns 索引列信息,比如索引上的列的排序方式 objects 對(duì)象信息,比如狀態(tài)和ddl time role_privs 角色權(quán)限,比如grant和admin選項(xiàng) segments 表和索引的數(shù)據(jù)段信息,比如tablespace和storage sequecnces 序列信息,比如序列的cache、cycle和ast_number source 除觸發(fā)器之外的所有內(nèi)置過程、函數(shù)、包的源代碼 synonyms 別名信息,比如引用的對(duì)象和數(shù)據(jù)庫鏈接db_link sys_privs 系統(tǒng)權(quán)限,比如grantee、privilege、admin選項(xiàng) tab_columns 表和視圖的列信息,包括列的數(shù)據(jù)類型 tab_privs 表權(quán)限,比如授予者、被授予者和權(quán)限 tables 表信息,比如表空間(tablespace),存儲(chǔ)參數(shù)(storage parms)和數(shù)據(jù)行的數(shù)量 triggers 觸發(fā)器信息,比如類型、事件、觸發(fā)體(trigger body) users 用戶信息,比如臨時(shí)的和缺省的表空間 views 視圖信息,包括視圖定義
在oracle中還有一些不常用的數(shù)據(jù)字典表,但這些表不是真正的字典家族,他們都是一些重要的單一的視圖。
view name 描述 user_col_privs_made 用戶授予他人的列權(quán)限 user_col_privs_recd 用戶獲得的列權(quán)限 user_tab_privs_made 用戶授予他人的表權(quán)限 user_tab_privs_recd 用戶獲得的表權(quán)限
其他的字典視圖中主要的是v$視圖,之所以這樣叫是因?yàn)樗麄兌际且詖$或gv$開頭的。v$視圖是基于x$虛擬視圖的。v$視圖是sys用戶所擁有的,在缺省狀況下,只有sys用戶和擁有dba系統(tǒng)權(quán)限的用戶可以看到所有的視圖,沒有dba權(quán)限的用戶可以看到user_和all_視圖,但不能看到dba_視圖。與dba_,all,和user_視圖中面向數(shù)據(jù)庫信息相反,這些視圖可視的給出了面向?qū)嵗男畔ⅰ?
在大型系統(tǒng)上化幾周時(shí)間手工輸入每一條語句
手工輸入帶用戶名變量的語句,然后再輸入每一個(gè)用戶名,這需要花好幾個(gè)小時(shí)的時(shí)間
寫一條sql語句,生成需要的alter user語句,然后執(zhí)行他,這只需要幾分鐘時(shí)間
很明顯我們將選擇生成sql的方法:
例:
select alter user||username||
temporary tablespace temp;
from dba_users
where usernamesys
and temporary_tablespacetemp;
這個(gè)查詢的結(jié)果將被脫機(jī)處理到一個(gè)文件中,然后在執(zhí)行:
alter user system temporary tablespace temp;
alter user outln temporary tablespace temp;
alter user dbsnmp temporary tablespace temp;
alter user scott temporary tablespace temp;
alter user demo temporary tablespace temp;