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