一.Oracle數(shù)據(jù)類型
1.字符數(shù)據(jù)類型
.> char:可以存儲字母數(shù)字值,長度在1到2000個字節(jié)。
.> varchar2:存儲可變長度的char類型字符串,大小在1到4000個字節(jié)范圍內(nèi)。
.> long:存儲可變長度的字符數(shù)據(jù),最多存儲2GB。
long類型的使用限制:
**************************************
*{
*.. 一個表中只有一列可以為long數(shù)據(jù)類型。
*.. long列不能定義為唯一約束或主鍵約束。
*.. long列上不能建立索引。
*.. 過程或存儲過程不能接受long數(shù)據(jù)類型的參數(shù)。
*}
***************************************
2.數(shù)字數(shù)據(jù)類型
.> number:存儲正數(shù),負數(shù),零,定點書和精度為38位的浮點數(shù)。
number類型的格式:
number[(p[,s])]
其中p為精度,表示數(shù)字的總位數(shù); s為范圍,表示小數(shù)點右邊的位數(shù),它在-84至127之間。
3.日期時間數(shù)據(jù)類型
.> date:存儲表的日期和時間數(shù)據(jù),使用7個字節(jié)固定長度,
每個字節(jié)分別存儲世紀,年,月,日,小時,分和秒;值從公元前4712年1月1日到公元9999年12月31日。
{
Oracle中的sysdate函數(shù)功能是返回當前的日期和時間。
}
.> timestamp:存儲日期的年,月,日以及時間的小時,分和秒值。其中秒值精確到小數(shù)點后6位,同時包含時區(qū)信息。
{
Oracle中的systimestamp函數(shù)功能是返回當前日期,時間和時區(qū)。
}
4.raw和long raw數(shù)據(jù)類型(二進制數(shù)據(jù))
.> raw: 存儲基于字節(jié)的數(shù)據(jù)。最多存儲2000個字節(jié),使用需指定大小。raw數(shù)據(jù)類型可以建立索引。
.> long raw: 存儲可變長度的二進制數(shù)據(jù)。最多能存儲2GB;不能索引。與long類型的限制同效。
5.lob數(shù)據(jù)類型('大對象')
***********************************
* lob類型可以存儲多達4GB的非結構化信息。
* Oracle中的表可以有多個lob列,每個lob列可以是不同的lob類型。
***********************************
.> clob: 存儲大量的單字節(jié)字符數(shù)據(jù)和多字節(jié)字符數(shù)據(jù)。例:非結構化的XML文檔。
.> blob: 存儲較大的二進制對象。例:圖形,視頻,音頻等。
.> bfile: 文件定位器;指向位于服務器文件系統(tǒng)是的二進制文件(存儲一個文件路徑)。
-----------------------------------------------------------------------------------------------------------------------
6.Oracle中偽列
.> rowid: 返回行地址,可用來定位表中的一行。可以唯一地標識數(shù)據(jù)庫中的一行。
重要的用途
****************************
*.. 能一最快的方式訪問表中的一行
*.. 能顯示表的行是如何存儲的
*.. 可以作為表中行的唯一標識
****************************
.> rownum: 對于一個查詢返回的每一行進行標識;可用于限制查詢返回的行數(shù)。(不是數(shù)據(jù)表的實際列)
二.Oracle中的sql操作符
.>算數(shù)操作符:
包括: +(加),-(減),*(乘),/(除)
*和/具有相同的優(yōu)先級,+和-j具有相同的優(yōu)先級,*和/的優(yōu)先級高于+和-。可用小括號來控制計算順序。
.>比較操作符:
包括:=(相等),!=(不相等),<(小于),>(大于),<=(小于等于),>=(大于等于)
between....and...(檢查是否在兩個值之間)
in(與列表中的值相匹配)
link(匹配字符模式<模糊匹配>)
is null(檢查是否為空)
.>邏輯操作符:
包括:
and(與),or(或),not(非)
.>集合操作符:
包括:
union(聯(lián)合):返回兩個查詢選定的所有不重復的行。
union all(聯(lián)合所有):合并兩個查詢選定的所有行,包括重復的行。
intersect(交集):返回兩個查詢共有的行。
minux(減集):返回有第一個查詢選定但是沒有被第二個查詢選定的行。
.>連接操作符:
|| : 將兩個或多個字符串合并成一個字符串,或者將一個字符串與一個數(shù)值合并在一起。
操作符的優(yōu)先級
************************************************
*算數(shù)操作符 高
*連接操作符 |
*比較操作符 |
*not邏輯操作符 |
*and邏輯操作符 |
*or邏輯操作符 低
************************************************
三.SQL函數(shù)
.>日期函數(shù)
add_months(d,n)<d是日期,n是月數(shù)>:返回指定日期加上指定月數(shù)后的日期值。
months_between(d1,d2)<d1,d2都是兩個日期>:返回兩個日期之間的月數(shù)。
last_day(d)<d是日期>:返回指定日期當月的最后一天的日期值。
round(d,[fmt])<d是日期,fmt指定格式模型>:返回日期值,此日期四舍五入為格式模型指定的單位。
(fmt是一個選項,默認舍入為最靠近的那一天。
如果格式為‘year’則舍入到年的開始,即1月1日;
如果格式為‘month’則舍入到月的第一天;
如果格式為‘day’則舍入到最靠近的星期天。
)
next_day(d,day)<d是日期,day指定周內(nèi)任何一天 如‘星期一’>:返回指定的下一個星期幾的日期。
trunc(d,[fmt])<d是日期,fmt指定格式模型>:返回日期值,指定日期截斷為格式模型指定的單位的日期。
(與round函數(shù)類似,不同的是它只舍不入。)
extract(fmt from d)<fmt指定格式模型,d是日期>:提取日期時間類型中的特定部分。
(fmt取值可以是:year,month,day,hour,minute,second;注意此處的格式不能使用單引號。)
.>字符函數(shù)
函數(shù) 說明 輸入 輸出結果
initcp(char) 首字母大寫 select initcap('hell0') from dual Hello
lower(char) 轉(zhuǎn)換為小寫 select lower('FUN') from dual fun
upper(char) 轉(zhuǎn)換為大寫 select upper('sun') from dual SUN
ltrim(char,set) 左剪裁 select ltrim('xyzadams','xyz') from dual adams
rtrim(char,set) 右剪裁 select rtrim('xyzadams','ams')from dual xyzad
translate(char,from,to) 按字符翻譯 select translate('jack','abcd','1234') from dual j12k
peplace(char,search_str,replace_str) 字符串替換 select replace('jack and jue','j','bl') from dual jack and blue
instr(char,substr[,pos]) 查找子串位置 select instr('worldwide','d') from dual 5
substr(char,pos,len) 取子字符串 select substr('abcdefg',3,2) from dual cd
concat(char1,char2) 連接字符串 select concat('Hello','world') from dual Helloworld
=================================
.. chr(int)<int是ASCII碼>:根據(jù)ASCII碼返回對應的字符。
.. lpad(str,int,char)和rpad(str,int,char)<str是源字符串,int指定總長度,char是填充的字符>:用指定的字符(左|右)填充源字符串到指定長度。
.. trim([[leading|trailing] trim_char] from trim_sourse)<trim_char指定裁剪的字符,trim_sourse是源字符串>
(
此函數(shù)組合了ltrim和rtrim的功能。
leading選項時與ltrim相似,裁減與trim_char相等的開頭字符。
trailing選項時與rtrim相似,裁減與trim_char相等的結尾字符。
)
.. length(str)<str是字符串>:返回字符串的長度。
.. decode(expr,search1,trsult1,search2,trult2...[,default])<expr是字符變量或數(shù)據(jù)表字段,search是expr的預期值,trsult是返回值,default是無匹配是返回的值>
(
decode函數(shù)進行逐個值的替換。
)
.>數(shù)字函數(shù)
函數(shù) 說明 輸入 輸出結果
abs(n) 取絕對值 select abs(-15) from dual 15
ceil(n) 向上取整 select ceil(44.778) from dual 45
sin(n) 正弦 select sin(1.571) from dual 0.999999979
cos(n) 余弦 select cos(0) from dual 1
sign(n) 取符號 select sign(-32) from dual -1
floor(n) 向下取整 select fllor(100.2) from dual 100
power(n) m的n次冪 select power(4,2) from dual 16
mod(m,n) 取余數(shù) select mod(10,3) from dual 1
round(m,n) 四舍五入 select round(100.256,2) from dual 100.26
trunc(m,n) 截斷 select trunc(100.256,2) from dual 100.25
sqrt(n) 平放根 select sqrt(4) from dual 2
.>轉(zhuǎn)換函數(shù)
to_char(d|n[,fmt])<d是日期,n是數(shù)字,fmt是指定日期或數(shù)字的格式>:將指定的日期或數(shù)字轉(zhuǎn)換成字符串(varchar2)。
to_date(char[,fmt])<char是日期格式的字符串,fmt是日期的格式>:將char或varchar數(shù)據(jù)類型轉(zhuǎn)換為日期類型。
to_number(char)<char是包含數(shù)字的字符串>:將包含數(shù)字的字符串轉(zhuǎn)換為數(shù)字。
.>其他函數(shù)
nvl(expression1,expression2)<exprission1是變量或數(shù)據(jù)表字段,exprission2是一個值>:將空值替換為指定的值。
(
如果expression1為NULL,則nvl返回expression2
如果expression1不為NULL,則nvl返回expression1
<sexpression2的類型將轉(zhuǎn)換為expression1的類型>
)
nvl2(expression1,expression2,expression3)<exprission1是變量或數(shù)據(jù)表字段,exprission2和exprission3是一個值>:與nvl類似
(
如果expression1不為NULL,則nvl返回expression2
如果expression1為NULL,則nvl返回expression3
)
nullif(expr1,expr2)<expr1,expr1分別為表達式>:比較兩個表達式,如果相等,則返回空值(null),否則返回expr1。
.>分組函數(shù)
avg(column)<column是列名>:返回參數(shù)中指定列的平均值。
min(column)<column是列名>: 返回參數(shù)中指定列的最小值。
max(column)<column是列名>: 返回參數(shù)中指定列的最大值。
sum(column)<column是列名>: 返回記錄集中值的總和。
count([distinct]*|column[,column..])<distinct選項指定去除重復項,column是列名>: 返回記錄集中的行數(shù)。
<group by子句用于將信息表化分為組,having字句用來指定group by的檢索條件>
.>分析函數(shù)
row_number() over ([partition by column] order by clause[,多列] [desc|esc])<column指定分組列名,clause指定排列列名>:為有序組中的每一行(化分部分的行或查詢返回的行)返回一個唯一的排序
值,序號由order by字句指定,從1開始。(值相同,而排位不相同)
rank () over ([partition by column] order by clause[,多列] [desc|esc])<column指定分組列名,clause指定排列列名>:計算一個值在一組值中的排位,排位是以1開頭的連續(xù)整數(shù),具有相等值的行排
位相同,序數(shù)隨后跳躍相應的數(shù)值。(值相同,排位相同,排位有可能不連續(xù))
dense_rank() over ([partition by column] order by clause[,多列] [desc|esc])<column指定分組列名,clause指定排列列名>:計算一個行在一組有序行中的排位,排位是以1開頭的連續(xù)整數(shù),具有相同
值的排位相同,并且排位是連續(xù)的。(值相同,排位相同,排位連續(xù))
四.Oracle鎖
鎖定是數(shù)據(jù)庫用來控制共享資源并發(fā)訪問的機制。
.>行級鎖(用于特定行)
行級鎖是一中排他鎖,防止其他事務修改此行,當是不會阻止讀取此行的操作。
在使用insert,update,delete和select ...for update等語句時,Oralce會自動應用行級鎖定。
select...for update語句允許用戶每次選擇多行記錄進行更新,這些記錄會被鎖定,且只能有發(fā)起查詢的用戶進行編輯。只有在回滾或提交事務后,鎖定才會釋放,其他用戶才可以編輯這些記錄。
{
select ...for update [of column_list] [wait n | nowait ]<column_list是列的列表,n是等待的秒數(shù),nowait指定不等待>
> of 子句用于指定即將更新的列,即鎖定行上的特定列。
> wait 子句指定等待其他用戶釋放鎖的秒數(shù),防止無限制的等待。
}
.>表級鎖(用于整個表)
表級鎖定將保護表數(shù)據(jù),在事務處理過程中,表級鎖會限制對整個表的訪問??梢允褂胠ock table語句顯示地鎖定表。表級鎖用來限制對表執(zhí)行添加,更新和刪除等修改操作。
{
lock table <table_name> in <lock_mode> mode [nowait];<table_name是鎖定表的名稱,lock_mode是鎖定的模式,nowait指定不等待>
>lock_mode是鎖定的模式。
>nowait 關鍵字用于防止無限期的等待其他用戶釋放鎖。
(
表級鎖的模式包括:
>行共享(row share,rs): 允許其他用戶訪問和鎖定該表,但是禁止排他鎖定整個表。
>行排他(row exclusive,rx):與行共享相同,同時禁止其他用戶在此表上用共享鎖。
>共享(share, s):僅允許其他用戶查詢表中的行,但不允許插入,更新和刪除。
>共享行排他(share row exclusive,srx):執(zhí)行比共享鎖更多的限制。防止其他事物在表上應用共享鎖,共享排他鎖以及排他鎖。
>排他(exclusive,x):對表執(zhí)行最大限制。除了允許其他用戶查詢該表的記錄,排他鎖防止其他事務對表做任何更改或在表上應用任何類型的鎖。
)
* 執(zhí)行commit或rollback命令可以釋放鎖定。
}
五.Oracle表分區(qū)
表分區(qū)的優(yōu)點:
.. 改善表的查詢性能。
.. 表更容易管理。
.. 便于備份和恢復。
.. 提高數(shù)據(jù)安全性。
.>范圍分區(qū)
范圍分區(qū)根據(jù)表的某一列或一組列的值范圍,決定數(shù)據(jù)存儲在那個區(qū)上。
在create table語句中增加parition子句可以創(chuàng)建表分區(qū)。
語法:
partition by rang (column_name)
(
partition part1 value less than(range1) [tablespace tbs1],
partition part2 value less than(range2) [tablespace tbs2],
......
partition partn value less than(MAXVALUE) [tablespace tbsN]
);
其中:
column_name:是以其為基礎創(chuàng)建范圍分區(qū)的列,特定列的該列值稱為分區(qū)鍵。
part1..partn:是分區(qū)的名稱。
range1...MAXVALUE:是分區(qū)的邊界值。
tbs1...tbsn:是分區(qū)所在的表空間(可選項)。
.>散列分區(qū)
散列分區(qū)通過分區(qū)鍵值上執(zhí)行一個散列函數(shù)來決定數(shù)據(jù)的物理位置。(散列分區(qū)把記錄平均分布到不同的分區(qū),減少了磁盤I/O爭用的可能性)
語法:
partition by hash (column_name)
partitions number_of_partitions [store in (tablespace_list)];
或
partition by hash (column_name)
(
partition part1 [tablespace tbs1],
partition part2 [tablespace tbs2],
.....
partition partn [tablespace tbsn]
)
其中:
column_name:是以其為基礎創(chuàng)建散列分區(qū)的列。
number_of_partitions:是散列分區(qū)的數(shù)目,使用這種方法系統(tǒng)會自動生成分區(qū)的名稱。
tablespace_list:指定分區(qū)使用的表空間,如果分區(qū)數(shù)目比表空間的數(shù)目多,分區(qū)將會以循環(huán)的方式分配到表空間中。
.>復合分區(qū)
復合分區(qū)是范圍分區(qū)和散列分區(qū)的結合。
語法:
partition by rang (column_name1)
subpartition by hash (column_name2)
subpartitioins number_of_partitions [store in (tablespace_list)]
(
partition part1 value less than(range1) [tablespace tbs1],
partition part2 value less than(range2) [tablespace tbs2],
......
partition partn value less than(MAXVALUE) [tablespace tbsN]
)
其中:
column_name1:是以其為基礎創(chuàng)建范圍分區(qū)的列。
column_name2:是以其為基礎創(chuàng)建散列分區(qū)的列。
number_of_partitions:是散列分區(qū)的數(shù)目。
part1..partn:是分區(qū)的名稱。
range1...MAXVALUE:是分區(qū)的邊界值。
.>列表分區(qū)
列表分區(qū)允許用戶明確地控制行到分區(qū)的映射。
語法:
partition by list (column_name)
(
partition part1 values (values_list1),
partition part2 values (values_list2),
....
partition partn values (DEFAULT)
)
其中:
column_name:是以其為基礎創(chuàng)建列表分區(qū)的列。
part1..partn:是分區(qū)的名稱。
values_list:是對應分區(qū)鍵值的列表。
DEFATLT:關鍵字允許存儲前面的分區(qū)不能存儲的記錄。
***************************************************************
*在分區(qū)表中插入記錄:與在普通表中插入數(shù)據(jù)完全相同。
*在分區(qū)表中查詢記錄:select * from 表名 partition (分區(qū)名)
*刪除分區(qū)中的記錄: delete from 表名 partitioin (分區(qū)名)
***************************************************************
<*>分區(qū)維護操作
.>添加分區(qū)
alter table ... ADD partition語句用于在現(xiàn)所有的最后一個分區(qū)(稱為'高'端)之后添加新的分區(qū)。
例:
alter table sales add partitions p4 values less than (4000);
.>刪除分區(qū)
alter table ... drop partition 語句用于刪除分區(qū)。(刪除分區(qū)時,分區(qū)中的數(shù)據(jù)也隨之刪除)
例:
alter table sales drop partition p4;
.>截斷分區(qū)
alter table ... truncate partition 語句用于截斷分區(qū),截斷分區(qū)將刪除分區(qū)中的所有記錄。
例:
alter table sales truncate partition p3;
.>合并分區(qū)
合并分區(qū)可將范圍分區(qū)表或復合分區(qū)表的兩個相鄰分連接起來。結果分區(qū)將繼承被合并的兩個分區(qū)的較高上界。
語法:
alter table table_name
merge partitions partitions1_name,partitions2_name
into partition3_name;
其中:
table_name:是表名。
partitions1_name,partitions2_name:是已有分區(qū)。
partitions3_name:合并到分區(qū)的名稱。
.>拆分分區(qū)
使用split partition語句在表的開頭或中間添加分區(qū)。拆分分區(qū)允許用戶將一個分區(qū)拆分為兩個分區(qū)。當分區(qū)過大,可以對分區(qū)進行拆分。
語法:
alter table table_name split partition partiton_name at (value)
into (partition partiton1,partition partiton2);
其中:
table_name:是表名。
partiton_name:已有分區(qū)名。
value:拆分分隔值。
partition partiton1,partition partiton2:表示拆分后的新分區(qū)。
六.同義詞
同義詞是數(shù)據(jù)庫對像的一個別名,這些對象可以是表,視圖,序列,過程,函數(shù),程序包,甚至其他同義詞。
同義詞用途:
{
.. 簡化sql語句
.. 隱藏對象的名稱和所有者
.. 為分布式數(shù)據(jù)庫的遠程對象提供了位置透明性
.. 提供對象的公共訪問
}
同義詞允許應用程序訪問數(shù)據(jù)庫對象,不論哪個用戶或哪個數(shù)據(jù)庫擁有該對象。但是同義詞不能代替權限,在使用同義詞前要確保用戶已得到訪問對象的權限。
可以通過同義詞執(zhí)行select,insert,update,delete,lock table,grant和revoke等語句。同義詞只是表的一個別名,因此對它的所有操作都會影響到表。
.>私有同義詞
私有同義詞只能被當前模式的用戶訪問。
私有同義詞名稱不可與當前模式的對象名稱相同。
要在自身的模式創(chuàng)建私有同義詞,用戶必須擁有create sysnonym系統(tǒng)權限。
要在其他用戶模式創(chuàng)建同義詞,用戶必須擁有create any synonym系統(tǒng)權限。
語法:
create [or replace] synony [schema.]synonym_name for [schema.]object_name
其中:
or relaoce:表示在同義詞存在的情況下替換該同義詞。
synonym_name:表是要創(chuàng)建的同義詞的名稱。
object_name:指定要為之創(chuàng)建同義詞的對象的名稱。
.>公有同義詞
公有同義詞可被所有的數(shù)據(jù)庫用戶訪問。
創(chuàng)建公有同義詞,用戶必須擁有greate public synonym系統(tǒng)權限。
create [or replace] public synonym synonym_name for [schema.]object_name
其中:
or relaoce:表示在同義詞存在的情況下替換該同義詞。
synonym_name:表是要創(chuàng)建的同義詞的名稱。
object_name:指定要為之創(chuàng)建同義詞的對象的名稱。
<*>刪除同義詞
drop synonym語句用于從數(shù)據(jù)庫中刪除同義詞。要刪除同義詞用戶必須有相應的權限。
語法:
drop [public] synonym [schema.]synonym_name;
七.序列
序列是用來生成唯一,連續(xù)的整數(shù)的數(shù)據(jù)庫對象。
序列通常用來自動生成主鍵或唯一的值。
序列可以按升序排列,也可以按降序排列。
語法:
create sequence sequence_name
[stare with integer]
[increment by integer]
[maxvalue integer|nomaxvalue]
[minvalue integer|nominvalue]
[cycle|nocycle]
[cache integer|nocache];
其中:
sequence_name:是創(chuàng)建的序列名稱。
stare with:指定要生成的第一個序列號。
increment by:用于指定序列好之間的間隔。
maxvalue:指定序列可以生成的最大值。
nomaxvalue:如果指定了nomaxvalue,oracle將升序序列的最大值設為10的27次方;將降序序列的最大值設為-1。
minvalue:指定序列可以生成的最小值。
nominvalue:無最小值,oracle將升序序列的最小值設為1;將降序序列的最小值設為10的-26次方。
cycle:指定序列在達到最大值或最小值后,將繼續(xù)從頭開始生成值。
nocycle:指定序列在達到最大值或最小值后,將不能在繼續(xù)生成值。這是默認選項。
cyche:使用cyche選項可以預先分配一組序列號,并將其保存在內(nèi)存中。這樣可以更快地訪問序列號,但用完緩存中的所有序列號,Oralce將生成另一組數(shù)值,并將其保留在緩存中。
nocyche:不緩存序列號。 如果創(chuàng)建序列時忽略了cyche和nocyche選項,Oracle將默認緩存20個序列號。
<*>訪問序列
語法;
sequence_name . nextval|currval
其中:
sequence_name:是已創(chuàng)建的序列名稱。
nextvla:創(chuàng)建序列后第一次使用nextval時,將返回該序列的初始值。以后在引用nextval時,將使用increment by子句的值來增加序列值,并返回這個新值。
currval:返回序列的當前值。
<*>更改序列
alter sequence 命令用于修改序列的定義。
{
.. 設置或刪除minvalue或maxvale。
.. 修改增量值。
.. 修改緩存中的序列號的數(shù)目。
}
語法:
alter sequence [schema.]sequence_name
[increnment by integer]
[maxvalue integer|nomaxvalue]
[minvalue integer|nomaxvalue]
[cycle|nocycle]
[cache ingeter|nocache];
注意:不能修改序列的start with參數(shù)。
<*>刪除序列
drop sequence命令用于刪除序列。
語法:
drop sequence 序列名
八.視圖
視圖一經(jīng)過定制的方式顯示包含愛一個或多個表(或其他視圖)中的數(shù)據(jù)。
語法:
create [or replace] [force|noforce] view view_name
[(alias[,alias]...)]
as select_statement
[with check option [constraint constraint]]
[with read on
ly];
其中:
or relaoce:表示在視圖存在的情況下替換該視圖。
force:無論基表是否存在,都將創(chuàng)建視圖。
noforce:僅當基表存在才創(chuàng)建視圖。
view_name:創(chuàng)建視圖的名稱。
alias:指定有視圖的查詢所選擇的表達式或列的別名。別名的數(shù)目必須與視圖所選擇的表達式的數(shù)目相匹配。
select_statement:表示select語句。
with check option:指定只能插入或更新視圖可以訪問的行。術語constraint表示check option約束指定的名稱。
with read only:確保不能在此視圖上執(zhí)行任何修改操作。(只瀆)
<*>在視圖上使用DML語句的限制:
> 在視圖中使用DML語句只能修改一個底層的基表。
> 如果記錄的修改違反了基表的約束條件,則無法更新視圖。
> 如果創(chuàng)建的視圖包含連接運算符,distinct運算符,集合運算符,聚合運算符和Group by子句,則無法更新視圖。
> 如果創(chuàng)建的視圖包含偽劣或表達式,則將無法更新視圖。
<*>鍵保留表
在聯(lián)結視圖中,如果視圖包含了一個表的主鍵,并且也是這個視圖的主鍵,則這個鍵被保留,這個表稱為鍵保留表。
<*> 刪除試圖
語法:
drop view 視圖名稱
九.索引
索引只是一種快速訪問數(shù)據(jù)的途徑,它只影響執(zhí)行的速度。
.>唯一索引
索引可以是唯一的,也可以是非唯一的。唯一索引可以確保在定義索引的列中,表的任意兩個值都不相同。
語法:
create unique index 索引名 on 表名(唯一列名);
其中:
unique:指定為唯一索引。
.>組合索引
組合索引是在表中的多列上創(chuàng)建的索引。
語法:
create index 索引名 on 表名(列名,列名);
.>反向鍵索引
可以在create index語句中指定關鍵字Reverse創(chuàng)建反向鍵索引。
語法:
create index 索引名 on 表名(列名) reverse;
其中:
reveerse:指定為反向鍵索引。
使用noreverse可以將反向鍵索引重建為標準索引。
例: alter index 索引名 rebuild noreverse;
注意: 不能將標準索引重建為反向鍵索引。
.>位圖索引
使用位圖索引的優(yōu)點在于,它最適用于低基數(shù)列,也就是不同值的數(shù)目比表的行數(shù)少的列(枚舉列)。
語法:
create bitmap index 索引名 on 表名 (列名);
其中:
bitmap:指定為位圖索引。
<*>位圖索引優(yōu)點
> 對于大批即席查詢,可以減少響應時間。
> 相比其他索引技術,占用空間明顯減少。
> 即使在配置很低的終端硬件上,也嫩個獲得顯著的性能。
.>索引組織表
索引組織表與普通表的不同之處在于,該表的數(shù)據(jù)存儲在與關聯(lián)的索引中。對表數(shù)據(jù)進行的修改,如添加新行,更新和刪除行,只會導致對索引的更新。
語法:
create table 表名
(
列名 類型 primary key,
...
)
organization index;
其中:
organization index: 指定為索引組織表。
<*>注釋
primary key是創(chuàng)建索引組織表所必需的。
.>索引中分區(qū)
> 局部分區(qū)索引
局部分區(qū)索引是在分區(qū)表上創(chuàng)建的一中索引,在局部分區(qū)中Oracle為表的每個分區(qū)建立一個獨立的索引。
語法:
create index 索引名 on 表名(列名) local;
其中:
local:指定為本地分區(qū)創(chuàng)建索引。
> 全局分區(qū)索引
全局分區(qū)索引是指在分區(qū)表或非分區(qū)表上創(chuàng)建的索引。
語法:
create index 索引名 on 表名(列名) global
partition onrange (列名)
(
...分區(qū)
)
其中:
global:指定為全局分區(qū)創(chuàng)建索引。
>全局非分區(qū)索引
全局非分區(qū)索引是在分區(qū)表上創(chuàng)建的全局索引,它類似于非分區(qū)表上的索引,索引的結構不會被分割。
十.pL/Sql編程
優(yōu)點:
>支持sql。
>支持面向?qū)ο缶幊?oop)。
>更好的性能。
>可移植性。
>與sql集成。
>安全性。
<*> PL/SQL塊
>聲明塊:聲明塊中使用的變量,游標和自定義異常。這些聲明的作用域僅限于它們所在的塊。此外,局部子程序也可以在PL/SQL塊的聲明部分中聲明。
>可執(zhí)行部分:執(zhí)行命令并操作在聲明部分聲明的變量和游標。
>異常處理部分:處理執(zhí)行塊時引發(fā)的異常。
pl/sql塊聲明語法:
[declare
所有聲明]
begin
執(zhí)行語句
[exception
異常處理]
end;
>pl/sql對大小寫不敏感,但是用戶和用戶的開發(fā)團隊應該選擇一個合適的編碼標準,以確保最好的使用共享池。
>pl/sql中一些復合符號的含義:
:= 賦值操作符
|| 連接操作符
-- 單行注釋
/*,*/ 多行注釋
<<,>> 標簽分隔符
.. 范圍操作符
** 求冪操作符
<*>數(shù)據(jù)類型
標量數(shù)據(jù)類型
>數(shù)字數(shù)據(jù)類型
數(shù)字數(shù)據(jù)類型存儲的數(shù)據(jù)為數(shù)字,用此數(shù)據(jù)類型存儲的數(shù)據(jù)可用于計算。
數(shù)字類型包括:
a: binary_integer
{
用于存儲帶符號的整數(shù)。值的大小范圍介于-2的31次方減1到2的31次方減1之間。
binary_integer的子類型:
.. natural:可以限制變量存儲非負整數(shù)值,即自然數(shù)。
.. naturaln:可以限制變量存儲自然數(shù),且非空。
.. positive:可以限制變量存儲正整數(shù)。
.. positiven:可以限制變量存儲正整數(shù),且非空。
.. signtype:可以限制變量只存儲-1,0和1三個值。
}
b: number
{
用于存儲整數(shù),定點數(shù)和浮點數(shù)。
語法:
number[(presision,scale)]
其中:
presision:是精度。
scale:是小數(shù)位數(shù)。
只能用整數(shù)文字指定精度和小數(shù)位數(shù),而不能用常量或變量指定精度和小數(shù)位數(shù)。
number數(shù)據(jù)類型的一些子類型包括:
.. decimal:用于聲明最高精度為38位的十進制數(shù)字的定點數(shù)。
.. float:聲明最高精度為126位的二進制數(shù)字的浮點數(shù)。
.. ingeter:聲名最高精度為38為的十進制數(shù)字的整數(shù)。
.. real: 聲明最高精度為63位的二進制數(shù)字的浮點數(shù)。
}
c: pls_integer
{
存儲帶符號的整數(shù)。pls_integer的大小范圍介于-2的31次方到2的31次方之間。與number和binary_integer類型相比,它執(zhí)行運算的速度更快。
pls_integer運算以機器算術運算為基礎,而number和binary_integer運算以庫算術為基礎。此外,與number數(shù)據(jù)類型相比,pls_integer需要的
存儲空間更小。通常建議在執(zhí)行處于pls_integer的數(shù)值范圍類的所有計算時使用此數(shù)據(jù)類型以提高效率。
}
>字符數(shù)據(jù)類型
字符數(shù)據(jù)類型勇于存儲字符串或字符數(shù)據(jù)。
a: char
{
存儲固定長度的字符數(shù)據(jù)。(不超過32767個字節(jié)的最大長度)
語法:
char[(maximum_size[char|btye])]
其中:
maximum_size:是最大長度。
char|byte:指定長度為字符數(shù)或字節(jié)數(shù)。
}
b: raw
{
存儲二進制數(shù)據(jù)或字節(jié)串。(類似于char,不同之處是它們不在字符集中轉(zhuǎn)換)
語法:
raw(maximum_size)
其中:
miximum_size:是最大長度。(最大長度是32767個字節(jié))
}
c:long和long Raw
{
pl/sql中 long類型是可變長度字符串。最大長度為32760個字節(jié)。類似Oralce中的varchar2。
long row類型類似于raw數(shù)據(jù)類型,存儲二進制數(shù)據(jù)或字節(jié)串,最大長度是32760個字節(jié)。
}
d: varchar
{
此類型可容納可變長度字符串。
語法:
varchar2(maximum_size [char|byte])
其中:
maximum_size:是最大長度。
char|byte:指定長度為字符數(shù)或字節(jié)數(shù)。
varchar2類型的子類型包括:
.. string
.. varchar
子類型的數(shù)值范圍與基本類型相同。
}
>日期時間數(shù)據(jù)類型
日期時間數(shù)據(jù)類型用于存儲日期和時間值。
a:date
{
用于存儲固定長度的日期和時間數(shù)據(jù)。它支持的日期范圍為:從公元前(B.C.E)4712年1月1日到公元(C.E)9999年12月31日。
date數(shù)據(jù)類型包括時間。
日期函數(shù)sysdate返回當前日期和時間。
初使化參數(shù)NLS_DATE_FORMAT用于設置默認日期格式。
}
b: timestamp
{
用于存儲日期和時間。是date數(shù)據(jù)類型的擴展,它存儲年,月,日,小時,分鐘和秒。
日期函數(shù)SYSTIMESTAMP返回當前的日期時間信息。
語法:
timestamp [(precision)]
其中:
precision:是精度。它代表秒字段小數(shù)部分中的位數(shù)。必須使用0到9之間的整數(shù)文字。默認為6。
初使化參數(shù)NLS_TIMESTAMP_FORMAT用于設置默認的timestamp格式。
}
>布爾數(shù)據(jù)類型
用于存儲邏輯值。
boolean
{
用于存儲邏輯值true,false和null。
只允許對boolean變量執(zhí)行邏輯操作。
}
lob類型
大對象(lob)數(shù)據(jù)類型用于存儲非結構化數(shù)據(jù)。大小限于4GB。DBMS_LOB程序包用于操作lob數(shù)據(jù)。
>bfile
用于將大型二進制對象存儲在操作系統(tǒng)文件中。即文件定位器。
定位器包含一個目錄的別名,用于指定目錄的完整路徑。
bfile數(shù)據(jù)類型的數(shù)據(jù)是只讀的,不能修改。
語法:
bfilename('目錄別名','文件名')
其中:
目錄別名使用create directiry語句創(chuàng)建。
>blob
用于將大型二進制對象存儲在數(shù)據(jù)庫中。blob數(shù)據(jù)類型可用于事務處理。
例:
要在表中插入圖象,先使用create directory 目錄名 as '系統(tǒng)目錄';創(chuàng)建一個目錄名。
使用grant read on directory 目錄名 to 用戶;授予讀取權限。
declare
l_bfile bfile;
l_blob blob;
begin
insert into 表名('blob類型的列名')
values (EMPTY_BLOB()) return 列名 into l_blob;
l_bfile :=BFILENAME('目錄別名','文件名');
DBMS_LOB.OPEN(l_bfile,DDMS_LOB.FILE_READONLY); --打開文件
DBMS_LOB.LOADFROMFIFE(l_blob,l_bfile,DBMS_LOB.GETLENGTH(l_bfile)); --加載到l_blob變量中。
DBMS_CLOSE(l_bfile); --關閉l_bfile文件。
commit;
END;
/
*****************************************************
oracle中插入一個blob數(shù)據(jù) (來自Google)
create or replace directory utllobdir as 'c:\xxx'; --你的BLOB文件所在位置。
create table bfile_tab (bfile_column BFILE);
create table t (blob_column BLOB);
----------------------------------------
declare
a_blob BLOB;
a_bfile BFILE := BFILENAME('UTLLOBDIR','BLOB文件名');
begin
insert into bfile_tab values (a_bfile)
returning bfile_column into a_bfile;
insert into t values (empty_blob())
returning blob_column into a_blob;
dbms_lob.fileopen(a_bfile);
dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
dbms_lob.fileclose(a_bfile);
commit;
end;
--------------------------------------------------------------------
>clob
用于將大型字符數(shù)據(jù)存儲在數(shù)據(jù)庫中。clob變量中的定位器指向大型字符數(shù)據(jù)的地址。
插入數(shù)據(jù)到clob列與普通字符串類似。
讀取clob數(shù)據(jù)
DBMS_LOB.READ(clob類型變量,要讀的字符數(shù),啟始位置(1為最前端),varchar2類型變量)
--讀取指定clob到varchar2,從開始位置讀多少。
>nclob
將大型 nchar數(shù)據(jù)存儲在數(shù)據(jù)庫中。nclob數(shù)據(jù)類型同時支持固定寬度字符和可變寬度字符(Unicode字符數(shù)據(jù))。nclob類型的使用方 法與clob類似。
屬性類型
屬性用于引用變量或數(shù)據(jù)庫列的數(shù)據(jù)類型,以及表示表中一行的記錄類型。
{
優(yōu)點:
.. 不需要知道被引用的列或表的具體數(shù)據(jù)類型。
.. 如果更改了被引用對象的數(shù)據(jù)庫定義,那么pl/sql在運行時變量的數(shù)據(jù)類型也會隨之更改。
}
>%type
引用某個變量或數(shù)據(jù)庫列的數(shù)據(jù)類型來聲名變量。
語法:
icode itemfile.itemcode%TYPE;
其中;
icode:是變量名稱。
itemfile.itemcode:是表名.列名。
**icode的數(shù)據(jù)類型與itemfile表中itemcode列的數(shù)據(jù)類型相同。
>%ROWTYPE
提供表中一行的記錄類型。
例:
emp_rec emp%ROWTYPE;
**emp_rec被聲明為emp一行的類型。
<*>邏輯比較
運算符 描述
= 等于
<>,!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
關系運算符用于比較sql和過程語句中的變量和常量,這些表達式稱為布爾表達式。
布爾表達式的結果為true,false或null,通常有邏輯運算符and,or和not連接,主要用在條件控制語句中。
布爾表達式共有3中類型,即數(shù)字布爾型,字符布爾型和日期布爾型。
<*>控制結構
pl/sql提供可通過控制結構來控制命令執(zhí)行的流程。
>條件控制
.. if 條件 then
執(zhí)行語句....
end if;
.. if 條件 then
執(zhí)行語句1....
else
執(zhí)行語句2....
end if;
.. if 條件 then
執(zhí)行語句1....
elsif 條件 then
執(zhí)行語句2....
end if;
.. case 待比較值
when 比較值 then 執(zhí)行語句....
when 比較值 then 執(zhí)行語句....
when 比較值 then 執(zhí)行語句....
[else when 執(zhí)行語句....]
end case;
>循環(huán)控制
.. loop
執(zhí)行語句....
[EXIT<表示強行跳出循環(huán)<|EXIT then (條件)<條件不為true就跳出>]
end loop;
.. while 條件 loop
執(zhí)行語句....
end loop;
.. for counter in [ reverse] value1..value2
loop
執(zhí)行語句....
end loop;
關鍵字reverse在for循環(huán)中屬于可選項。只有在需要對值從大到小執(zhí)行循環(huán)時,才會使用reverse關鍵字。
>順序控制
>goto語句
無條件地將控制權轉(zhuǎn)到標簽指定的語句。
語法:
goto 標簽名
標簽定義方法:<<標簽名>>
>null語句
什么都不做,只是將控制權轉(zhuǎn)到下一個語句。
<*>動態(tài)sql
Oracle中的動態(tài)sql可以通過本地動態(tài)sql命令執(zhí)行,也可以通過DBMS_SQL程序包來執(zhí)行。
語法:
execute immediate 動態(tài)sql語句字符串
[into select語句選擇的記錄值<參數(shù)類型>]
[using 綁定輸入?yún)?shù)變量<參數(shù)值>]
<*>錯誤處理
>預定義異常
pl/sql支持的預定義異常:
異常 說明
ACCESS_INTO_NULL 在未初始化對象時出現(xiàn)
CASE_NOTE_FOUND 在case語句中的選項與用戶輸入的數(shù)據(jù)不匹配是出現(xiàn)
COLLECTION_IS_NULL 在給尚未初始化的表或數(shù)組賦值時出現(xiàn)
CURSOR_ALREADY_OPEN 在用戶試圖打開已經(jīng)打開的游標是出現(xiàn),在重先打開游標前必須先將其關閉
DUP_VAL_ON_INDEX 在用戶試圖將重復的值存儲在使用唯一索引的數(shù)據(jù)庫列中時出現(xiàn)。
INVALID_CURSOR 在執(zhí)行非法的游標運算是出現(xiàn)。
INVALIE_NUMBER 在將字符串轉(zhuǎn)換為數(shù)字時出現(xiàn)。
LOGIN_DENIED 在輸入用戶名或密碼無效時出現(xiàn)
NO_DATA_FOUND 在表中不存在請求的行是出現(xiàn)。
STORAGE_ERROR 在內(nèi)存損壞或pl/sql耗盡內(nèi)存時出現(xiàn)。
TOO_MANY_ROWS 在執(zhí)行select into語句后返回多行時出現(xiàn)。
VALUE_ERROR 在產(chǎn)生大小限制錯誤時出現(xiàn)。
ZERO_DIVIDE 以零做除數(shù)時出現(xiàn)。
使用異常的語法:
exception 異常名稱 then
執(zhí)行異常處理語句....
>用戶自定義異常
語法:
聲明: 自定義異常名稱 EXCEPTION;
使用raise語句顯示引發(fā):raise 自定義異常名稱
處理: exception 自定義異常名稱 then
執(zhí)行異常處理語句....
>引發(fā)應用程序錯誤
過程RAISE_APPLICATION_ERROR用于創(chuàng)建用戶定義的錯誤信息。
語法:
RAISE_APPLICATION_ERROR(error_number,error_message)
其中:
error_number:指定的異常編號,必須在-20000和-20999之間的負整數(shù)。
error_message:異常指定的消息文本。長度可答2048字節(jié),錯誤消息是與error_number表示關聯(lián)的文本。
十一.游標管理
游標是構建在pl/sql中,用來查詢數(shù)據(jù),獲取記錄集合的指針。
<*>靜態(tài)游標
靜態(tài)游標是在編譯時知道其select語句的游標。
>隱式游標
Oracle預定義了一個sql的隱式游標,通過檢查隱式游標的屬性可以獲取與最近執(zhí)行的sql語句相關的信息。
隱式游標的屬性:
.. %found:在dml語句影響一行或多行時,%found屬性在返回true。
.. %notfound:與%found的作用正好相反,如果沒有影響任何行,則返回true。
.. %rowcount:返回dml語句影響的行數(shù),如果沒有影響行則返回0。
.. %isopen:返回游標是否已經(jīng)打開的值。在執(zhí)行sql語句之后,Oracle自動關閉sql游標,所以隱式游標的%isopen屬性始終為false。
>顯示游標
顯示游標是由用戶顯示聲明的游標。根據(jù)在游標中定義的查詢,查詢返回的行集合可以包含零行或多行,這些行稱為活動集。游標將指向活動集中的當前行。
顯示游標的標準操作過程:
1.聲明游標
2.打開游標
3.從游標中獲取記錄
4.關閉游標
顯示游標在declare部分的聲明語法:
cursor cursor_name [(parameter[,parameter..])]
[return return_type] is select_statement;
其中:
cursor_name:是游標的名稱。
parameter:用于為游標指定輸入?yún)?shù)。
return_type:定義游標提取的行的類型。
select_statement:指定游標的查詢語句。
在聲明游標后可以用下列語句控制游標:
open:打開游標。
fetch: 從游標中提取行。
close: 關閉游標。
顯示游標同樣有隱式游標的屬性并起相同。
使用顯示游標刪除或更改:
如果處理過程中需要刪除或更新行,在定義游標時必須使用select...for update語句,而在執(zhí)行delete或update時使用where current of 字句指定游標的當前行。
**提示:select語句必須只包括一個表,而且delete和update語句只有在打開游標并提取特定行之后才能使用