Oracle術語及其基本操作課件_第1頁
Oracle術語及其基本操作課件_第2頁
Oracle術語及其基本操作課件_第3頁
Oracle術語及其基本操作課件_第4頁
Oracle術語及其基本操作課件_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Oracle基礎培訓2009-12-24北京橙紅創(chuàng)新科技有限公司Oracle基礎培訓2009-12-24北京橙紅創(chuàng)新科技有限1培訓內(nèi)容Oracle概述Oracle術語Oracle基本操作Oracle中Join用法Oracle異常處理OracleUpdate操作OracleSQL優(yōu)化培訓內(nèi)容Oracle概述2Oracle概述1.1什么是ORACLEORACLE,即甲骨文股份有限公司,成立于1977年,總部位于美國加州Redwoodshore,是全球最大的信息管理軟件及服務供應商,也是最早進入中國的跨國軟件巨頭。甲骨文公司主要的產(chǎn)品目前分為以下幾大類:*服務器(服務器)及工具(主要競爭對手:國際商用機器、微軟)*數(shù)據(jù)庫服務器:最新版本11G*應用服務器:OracleApplicationServer*開發(fā)工具:OracleJDeveloper,OracleDesigner,OracleDeveloper,等*企業(yè)資源計劃(ERP)軟件。已有10年以上的歷史。2005年,并購了開發(fā)企業(yè)軟件的仁科軟件公司(PeopleSoft)以增強在這方面的競爭力。*客戶關系管理(CRM)軟件。自1998年開始研發(fā)這種軟件。2005年,并購了開發(fā)客戶關系管理軟件的希柏軟件公司(Siebel)。Oracle概述1.1什么是ORACLE3Oracle概述1.2Oracle數(shù)據(jù)庫Oracle數(shù)據(jù)庫的邏輯體系包括服務器和客戶端:OracleServer是一個對象一關系數(shù)據(jù)庫管理系統(tǒng)。它提供開放的、全面的、和集成的信息管理方法。每個Server由一個OracleDB和一個OracleServer實例組成。每個Oracle數(shù)據(jù)庫對應唯一的一個實例名SID,Oracle數(shù)據(jù)庫服務器啟動后,一般至少有以下幾個用戶:Internal,它不是一個真實的用戶名,而是具有SYSDBA優(yōu)先級的Sys用戶的別名,它由DBA用戶使用來完成數(shù)據(jù)庫的管理任務,包括啟動和關閉數(shù)據(jù)庫;Sys,它是一個DBA用戶名,具有最大的數(shù)據(jù)庫操作權限;System,它也是一個DBA用戶名,權限僅次于Sys用戶。Oracle客戶端即為數(shù)據(jù)庫用戶操作端,由應用、工具、SQL*NET組成,用戶操作數(shù)據(jù)庫時,必須連接到一服務器,該數(shù)據(jù)庫稱為本地數(shù)據(jù)庫(LocalDB)。在網(wǎng)絡環(huán)境下其它服務器上的DB稱為遠程數(shù)據(jù)庫(RemoteDB)。用戶要存取遠程DB上的數(shù)據(jù)時,必須建立數(shù)據(jù)庫鏈。Oracle數(shù)據(jù)庫的存儲結構:它由至少一個表空間和數(shù)據(jù)庫模式對象組成。這里,模式是對象的集合,而模式對象是直接引用數(shù)據(jù)庫數(shù)據(jù)的邏輯結構。模式對象包括這樣一些結構:表、視圖、序列、存儲過程、同一詞、索引、簇和數(shù)據(jù)庫鏈等。邏輯存儲結構包括表空間、段和范圍,用于描述怎樣使用數(shù)據(jù)庫的物理空間。而其中的模式對象和關系形成了數(shù)據(jù)庫的關系設計。數(shù)據(jù)塊(Block):是數(shù)據(jù)庫進行UO操作的最小單位,它與操作系統(tǒng)的塊不是一個概念。oracle數(shù)據(jù)庫不是以操作系統(tǒng)的塊為單位來請求數(shù)據(jù),而是以多個Oracle數(shù)據(jù)庫塊為單位。段(Segment):是表空間中一個指定類型的邏輯存儲結構,它由一個或多個范圍組成,段將占用并增長存儲空間。其中包括:數(shù)據(jù)段:用來存放表數(shù)據(jù);.索引段:用來存放表索引;臨時段:用來存放中間結果;回滾段:用于出現(xiàn)異常時,恢復事務。范圍(Extent):是數(shù)據(jù)庫存儲空間分配的邏輯單位,一個范圍由許多連續(xù)的數(shù)據(jù)塊組成,范圍是由段依此分配的,分配的第一個范圍稱為初始范圍,以后分配的范圍稱為增量范圍。Oracle概述1.2Oracle數(shù)據(jù)庫4Oracle術語2.1數(shù)據(jù)庫名數(shù)據(jù)庫名就是一個數(shù)據(jù)庫的標識,就像人的身份證號一樣。他用參數(shù)DB_NAME表示,如果一臺機器上裝了多全數(shù)據(jù)庫,那么每一個數(shù)據(jù)庫都有一個數(shù)據(jù)庫名。在數(shù)據(jù)庫安裝或創(chuàng)建完成之后,參數(shù)DB_NAME被寫入?yún)?shù)文件之中。格式如下:DB_NAME=myorcl...在創(chuàng)建數(shù)據(jù)庫時就應考慮好數(shù)據(jù)庫名,并且在創(chuàng)建完數(shù)據(jù)庫之后,數(shù)據(jù)庫名不宜修改,即使要修改也會很麻煩。因為,數(shù)據(jù)庫名還被寫入控制文件中,控制文件是以二進制型式存儲的,用戶無法修改控制文件的內(nèi)容。假設用戶修改了參數(shù)文件中的數(shù)據(jù)庫名,即修改DB_NAME的值。但是在Oracle啟動時,由于參數(shù)文件中的DB_NAME與控制文件中的數(shù)據(jù)庫名不一致,導致數(shù)據(jù)庫啟動失敗,將返回ORA-01103錯誤。Oracle術語2.1數(shù)據(jù)庫名5Oracle術語數(shù)據(jù)庫實例名與Oracle_SID一個數(shù)據(jù)庫實例(Instance)是由SGA,后臺進程以及數(shù)據(jù)文件組成,每個數(shù)據(jù)庫有自己的SGA和獨立的Oracle進程集。ORACLE_SID是操作系統(tǒng)的環(huán)境變量。兩者都是oracle實例,但兩者是有區(qū)別的。instance_name是oracle數(shù)據(jù)庫參數(shù),而ORACLD_SID用于與操作系統(tǒng)交互,也就是說,從操作系統(tǒng)的角度訪問實例名,必須通過ORACLE_SID。數(shù)據(jù)庫實例名除了與操作系統(tǒng)交互外,還用于網(wǎng)絡連接的oracle服務器標識。當你配置oracle主機連接串的時候,就需要指定0實例名。在winnt平臺,ORACLE_SID還需存在于注冊表中。在數(shù)據(jù)庫安裝之后,ORACLE_SID被用于定義數(shù)據(jù)庫參數(shù)文件的名稱。如:$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。Oracle術語數(shù)據(jù)庫實例名與Oracle_SID6Oracle術語2.3表空間一個Oracle數(shù)據(jù)庫由一個或多個邏輯存儲單元——表空間構成,表空間存儲著數(shù)據(jù)庫中所有的數(shù)據(jù);Oracle數(shù)據(jù)庫中的每個表空間由一個或多個文件組成,這些文件就是數(shù)據(jù)文件,它們是Oracle所在操作系統(tǒng)上的物理結構。Oracle數(shù)據(jù)庫中的所有數(shù)據(jù)物理的存儲在數(shù)據(jù)文件中。除了普通表空間外,Oracle還有幾種特殊的表空間。系統(tǒng)表空間(SYSTEM表空間)、UNDO表空間(回滾表空間)、臨時表空間(TEMP表空間)。系統(tǒng)表空間中除了保存數(shù)據(jù)字典外還保存所有的存儲過程、函數(shù)、包、觸發(fā)器和對象。UNDO表空間用于保存被DML語句影響的記錄的原始狀態(tài),以便在事務失敗的時候可以進行回滾。USER表空間TOOLS表空間當大的排序操作發(fā)生時,排序無法在內(nèi)存中完成,這時會使用臨時表空間。表空間可以設置為ONLINE和OFFLINE,OFFLINE的表空間無法進行訪問。通過對單獨表空間的ONLINE和OFFLINE,可以減少對系統(tǒng)的影響。表空間可以設置為READONLY和READWRITE兩種狀態(tài),只讀的表空間不可以進行鎖操作,因此甚至可以放到只讀設備上如CDROM。Oracle術語2.3表空間7Oracle術語同義詞同義詞用于屏蔽基表的身份,降低sql語句的復雜性,用戶不必知道同義詞所代表的表是哪一個表,從而用戶不需要指明表的所有者的名稱。同義詞有私有和公有之分。私有同義詞是普通用戶所創(chuàng)建的同義詞,只有創(chuàng)建該同義詞的用戶才能使用此同義詞,而公用同義詞是指數(shù)據(jù)庫管理員創(chuàng)建的,公用同義詞允許所有用戶使用。Oracle術語同義詞8Oracle術語序列建序列號主要用來自動產(chǎn)生數(shù)據(jù),如學生號自動加1,如果有很多的學生,比如10000個,那么使用序列較手工實現(xiàn)會提高效率。創(chuàng)建語法:createsequencenameincrementbyx//x為增長間隔startwithx//x為初始值maxvaluex//x為最大值minvaluex//x為最小值cycle//循環(huán)使用,到達最大值或者最小值時,重新建立對象cachex//制定緩存序列值的個數(shù)創(chuàng)建>createsequencesincrementby10startwith1nomaxvalue;刪除>dropsequences;使用>insertintoavalues(s.nextval,xxx);Oracle術語序列9Oracle基本操作創(chuàng)建表空間如何創(chuàng)建表空間創(chuàng)建表空間可以使用SQL語句,也可以通過DBAStudio。使用SYSTEM帳戶

droptablespacetestincludingcontents;//刪除表空間createtablespacetestlogging//datafile'd:\test.dbf'size100Mreuseautoextendonnext10Mmaxsizeunlimited;createtemporarytablespacetemptesttempfile'd:temptest.dbf'size10Mreuse;Oracle基本操作創(chuàng)建表空間10Oracle基本操作連接ORACLE

如何配置ORACLE客戶端如果Oracle服務器在另外一臺主機,你要連接到數(shù)據(jù)庫服務器。那么需要做的事情就是:在自己的機器安裝ORACLE客戶端。配置ORACLE連接:演示選擇”NetworkAdministration”--”Net8ConfigurationAssistant”進行配置Oracle基本操作連接ORACLE11Oracle基本操作常用的一些語句1.select*fromtab;查看當前表和視圖2.selectnamefromv$database;查看數(shù)據(jù)庫3.select*fromnls_database_parameters;查看數(shù)據(jù)庫參數(shù)設置4.select*fromuser_role_privs;查看當前用戶的角色5.selectusername,default_tablespace,temporary_tablespacefromuser_users;查看用戶名,默認/臨時表空間6.selectview_namefromuser_views;查看視圖7.selecttable_namefromuser_tables;查看表(和第1的區(qū)別)8.select*fromuser_constraints;查看表的約束情況9.select*fromuser_catalog查看表,視圖,同義詞和當前所有序列的簡明目錄Oracle基本操作常用的一些語句12Oracle中Join用法內(nèi)連接左連接右連接完全連接迪卡爾1.內(nèi)連接:選出兩個表中所有符合連接條件的row構成的集合。2.外連接,分為LEFT、RIGHT、FULL三種如有R與S做連接,那么LEFT是所有滿足條件的row以及所有在R屬性對應值在S中為NULL的集合。RIGHT是所有滿足條件的row以及所有在S屬性對應值在R中為NULL的集合FULL是所有滿足條件的row以及任何在R或S中出現(xiàn)NULL的集合Oracle中Join用法內(nèi)連接13Oracle中Join用法innerjoin(等值連接

只返回兩個表中聯(lián)結字段相等的行1.select

*

from

Table1a,Table2bwherea.id=b.id2.Select*fromtable1

A

INNERJOINtable2BONA.ID=B.IDOracle中Join用法innerjoin(等值連接14Oracle中Join用法leftjoin(左聯(lián)接)返回包括左表中的所有記錄和右表中聯(lián)結字段相等的記錄select

*

from

Table1

a,

table2

b

where

a.id=b.id(+);

SELECT*FROM

table1A

LEFTJOINtable2BONA.ID=B.IDOracle中Join用法leftjoin(左聯(lián)接)15Oracle中Join用法rightjoin(右聯(lián)接)

返回包括右表中的所有記錄和左表中聯(lián)結字段相等的記錄select

*

from

table1

a,

table2

b

where

a.id(+)=b.id;SELECT*FROM

table1A

RIGHTJOINtable2BONA.ID=B.IDOracle中Join用法rightjoin(右聯(lián)接)16Oracle中Join用法完全連接返回包括右表中的所有記錄和左表中的所有記錄select

*

from

table1

a,

table2

b

where

a.id=b.id(+)

union

select

*

from

Table1

a,

table2

b

where

a.id(+)=b.id;SELECT*FROM

table1A

FULLOUTERJOINtable2BONA.ID=B.IDOracle中Join用法完全連接17Oracle中Join用法迪卡爾

返回兩個表相等字段的乘積select

*

from

table1,

table2;Oracle中Join用法迪卡爾18Oracle異常處理1、異常的優(yōu)點如果沒有異常,在程序中,應當檢查每個命令的成功還是失敗。2、異常的分類有兩種類型的異常,一種為內(nèi)部異常,一種為用戶自定義異常。3、異常的拋出由三種方式拋出異常1.通過PL/SQL運行時引擎2.使用RAISE語句(RAISEexception_name;)3.調用RAISE_APPLICATION_ERROR存儲過程.定義DECLAREinventory_too_lowEXCEPTION;Oracle異常處理1、異常的優(yōu)點19Oracle異常處理4、異常的處理PL/SQL程序塊的異常部分包含了程序處理錯誤的代碼,當異常被拋出時,一個異常陷阱就自動發(fā)生,程序控制離開執(zhí)行部分轉入異常部分,一旦程序進入異常部分就不能再回到同一塊的執(zhí)行部分。下面是異常部分的一般語法:EXCEPTION

WHENexception_nameTHEN

Codeforhandingexception_name

[WHENanother_exceptionTHEN

Codeforhandinganother_exception]

[WHENothersTHEN

codeforhandinganyotherexception.]Oracle異常處理4、異常的處理20Oracle異常處理例子:declareexec_sql_errexception;var_msgvarchar(255);Beginupdatetable1setname=‘test’whereid=1;ifsql%notfoundthenraiseexec_sql_err;endif;Exceptionwhenothersthenwhenexec_sql_errthenvar_msg:=sqlcode||sqlerrm;dbms_output.put_line(var_msg);End;Oracle異常處理例子:21OracleUpdate用法關于ORACLE的UPDATE更新多表的問題一種是:

updatetable1set(field1,field2...)=(SelectField1,field2....fromtable2wheretable1.field1=table2.field1)wheretable1.field1in(selectfield1fromtable2)OracleUpdate用法關于ORACLE的UPDATE22OracleUpdate用法二種是:將table1,table2相關聯(lián)字段建立主鍵Primarykey或UnionkeyUpdate(SelectTable1.field1,table1.field2,table2.field1,table2.field2fromtable1,table2whereTable1.Field1=table2.field1)Settable1.table2=table2.table2,table1.fieldn=table2.tablen,......table1的Field1和table2的field1將需要建立主鍵或唯一索引才行OracleUpdate用法二種是:23OracleUpdate用法三種是:Oracle9i引入了MERGE命令,你能夠在一個SQL語句中對一個表同時執(zhí)行inserts和updates操作.MERGE命令從一個或多個數(shù)據(jù)源中選擇行來updating或inserting到一個或多個表.Oracle10g中MERGE有如下一些改進:1、UPDATE或INSERT子句是可選的2、UPDATE和INSERT子句可以加WHERE子句3、ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連接源表和目標表mergeintotable1usingtable2on(table1.field1=table2.field1and....)whenmatchedthenUpdatesettable1.field2=table2.field2,table1.fieldn=table2.fieldn,......whennotmatchedthen[doingotherthing]其余方法可使用游標;OracleUpdate用法三種是:24OracleSQL優(yōu)化1、選擇最有效率的表名順序例如:

TAB116,384條記錄

TAB21條記錄

選擇TAB2作為基礎表

(最好的方法)selectcount(*)fromtab1,tab2執(zhí)行時間0.96秒

選擇TAB2作為基礎表

(不佳的方法)selectcount(*)fromtab2,tab1執(zhí)行時間26.09秒如果有3個以上的表連接查詢,那就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所引用的表OracleSQL優(yōu)化1、選擇最有效率的表名順序25OracleSQL優(yōu)化2、WHERE子句中的連接順序

ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾.例如:(低效,執(zhí)行時間156.3秒)SELECT…FROMEMPEWHERESAL>50000ANDJOB=‘MANAGER’AND25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO);

(高效,執(zhí)行時間10.6秒)SELECT…FROMEMPEWHERE25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO)ANDSAL>50000ANDJOB=‘MANAGER’;

OracleSQL優(yōu)化2、WHERE子句中的連接順序26OracleSQL優(yōu)化3、SELECT子句中避免使用‘*‘當你想在SELECT子句中列出所有的COLUMN時,使用動態(tài)SQL列引用‘*’是一個方便的方法.不幸的是,這是一個非常低效的方法.實際上,ORACLE在解析的過程中,會將’*’依次轉換成所有的列名,這個工作是通過查詢數(shù)據(jù)字典完成的,這意味著將耗費更多的時間.4、減少訪問數(shù)據(jù)庫的次數(shù)當執(zhí)行每條SQL語句時,ORACLE在內(nèi)部執(zhí)行了許多工作:解析SQL語句,估算索引的利用率,綁定變量,讀數(shù)據(jù)塊等等.由此可見,減少訪問數(shù)據(jù)庫的次數(shù),就能實際上減少ORACLE的工作量.

例如,

以下有三種方法可以檢索出雇員號等于0342或0291的職員.

OracleSQL優(yōu)化3、SELECT子句中避免使用‘27OracleSQL優(yōu)化方法1(最低效)SELECTENAME,SALFROMEMPWHEREEMPNO=342;SELECTENAME,SALFROMEMPWHEREEMPNO=291;方法2(高效)SELECTA.ENAME,A.SAL,B.ENAME,B.SALFROMEMPA,EMPBWHEREA.EMPNO=342ANDB.EMPNO=291;5.盡量多使用COMMIT只要有可能,在程序中盡量多使用COMMIT,這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:COMMIT所釋放的資源:a.回滾段上用于恢復數(shù)據(jù)的信息.b.被程序語句獲得的鎖OracleSQL優(yōu)化方法1(最低效)28OracleSQL優(yōu)化6、用Where子句替換HAVING子句避免使用HAVING子句,HAVING只會在檢索出所有記錄之后才對結果集進行過濾.這個處理需要排序,總計等操作.如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷.例如:

低效:SELECTREGION,AVG(LOG_SIZE)FROMLOCATIONGROUPBYREGIONHAVINGREGION!=‘SYDNEY’ANDREGION!=‘PERTH’

高效

SELECTREGION,AVG(LOG_SIZE)FROMLOCATIONWHEREREGIONREGION!=‘SYDNEY’ANDREGION!=‘PERTH’GROUPBYREGIONOracleSQL優(yōu)化6、用Where子句替換HAVING29OracleSQL優(yōu)化7.用EXISTS替代IN8.用NOTEXISTS替代NOTIN9.用表連接替換EXISTS

通常來說,采用表連接的方式比EXISTS更有效率

SELECTENAMEFROMEMPEWHEREEXISTS(SELECT‘X’FROMDEPTWHEREDEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A’);(更高效)SELECTENAMEFROMDEPTD,EMPEWHEREE.DEPT_NO=D.DEPT_NOANDDEPT_CAT=‘A’;OracleSQL優(yōu)化7.用EXISTS替代IN30謝謝!Oracle術語及其基本操作課件31Oracle基礎培訓2009-12-24北京橙紅創(chuàng)新科技有限公司Oracle基礎培訓2009-12-24北京橙紅創(chuàng)新科技有限32培訓內(nèi)容Oracle概述Oracle術語Oracle基本操作Oracle中Join用法Oracle異常處理OracleUpdate操作OracleSQL優(yōu)化培訓內(nèi)容Oracle概述33Oracle概述1.1什么是ORACLEORACLE,即甲骨文股份有限公司,成立于1977年,總部位于美國加州Redwoodshore,是全球最大的信息管理軟件及服務供應商,也是最早進入中國的跨國軟件巨頭。甲骨文公司主要的產(chǎn)品目前分為以下幾大類:*服務器(服務器)及工具(主要競爭對手:國際商用機器、微軟)*數(shù)據(jù)庫服務器:最新版本11G*應用服務器:OracleApplicationServer*開發(fā)工具:OracleJDeveloper,OracleDesigner,OracleDeveloper,等*企業(yè)資源計劃(ERP)軟件。已有10年以上的歷史。2005年,并購了開發(fā)企業(yè)軟件的仁科軟件公司(PeopleSoft)以增強在這方面的競爭力。*客戶關系管理(CRM)軟件。自1998年開始研發(fā)這種軟件。2005年,并購了開發(fā)客戶關系管理軟件的希柏軟件公司(Siebel)。Oracle概述1.1什么是ORACLE34Oracle概述1.2Oracle數(shù)據(jù)庫Oracle數(shù)據(jù)庫的邏輯體系包括服務器和客戶端:OracleServer是一個對象一關系數(shù)據(jù)庫管理系統(tǒng)。它提供開放的、全面的、和集成的信息管理方法。每個Server由一個OracleDB和一個OracleServer實例組成。每個Oracle數(shù)據(jù)庫對應唯一的一個實例名SID,Oracle數(shù)據(jù)庫服務器啟動后,一般至少有以下幾個用戶:Internal,它不是一個真實的用戶名,而是具有SYSDBA優(yōu)先級的Sys用戶的別名,它由DBA用戶使用來完成數(shù)據(jù)庫的管理任務,包括啟動和關閉數(shù)據(jù)庫;Sys,它是一個DBA用戶名,具有最大的數(shù)據(jù)庫操作權限;System,它也是一個DBA用戶名,權限僅次于Sys用戶。Oracle客戶端即為數(shù)據(jù)庫用戶操作端,由應用、工具、SQL*NET組成,用戶操作數(shù)據(jù)庫時,必須連接到一服務器,該數(shù)據(jù)庫稱為本地數(shù)據(jù)庫(LocalDB)。在網(wǎng)絡環(huán)境下其它服務器上的DB稱為遠程數(shù)據(jù)庫(RemoteDB)。用戶要存取遠程DB上的數(shù)據(jù)時,必須建立數(shù)據(jù)庫鏈。Oracle數(shù)據(jù)庫的存儲結構:它由至少一個表空間和數(shù)據(jù)庫模式對象組成。這里,模式是對象的集合,而模式對象是直接引用數(shù)據(jù)庫數(shù)據(jù)的邏輯結構。模式對象包括這樣一些結構:表、視圖、序列、存儲過程、同一詞、索引、簇和數(shù)據(jù)庫鏈等。邏輯存儲結構包括表空間、段和范圍,用于描述怎樣使用數(shù)據(jù)庫的物理空間。而其中的模式對象和關系形成了數(shù)據(jù)庫的關系設計。數(shù)據(jù)塊(Block):是數(shù)據(jù)庫進行UO操作的最小單位,它與操作系統(tǒng)的塊不是一個概念。oracle數(shù)據(jù)庫不是以操作系統(tǒng)的塊為單位來請求數(shù)據(jù),而是以多個Oracle數(shù)據(jù)庫塊為單位。段(Segment):是表空間中一個指定類型的邏輯存儲結構,它由一個或多個范圍組成,段將占用并增長存儲空間。其中包括:數(shù)據(jù)段:用來存放表數(shù)據(jù);.索引段:用來存放表索引;臨時段:用來存放中間結果;回滾段:用于出現(xiàn)異常時,恢復事務。范圍(Extent):是數(shù)據(jù)庫存儲空間分配的邏輯單位,一個范圍由許多連續(xù)的數(shù)據(jù)塊組成,范圍是由段依此分配的,分配的第一個范圍稱為初始范圍,以后分配的范圍稱為增量范圍。Oracle概述1.2Oracle數(shù)據(jù)庫35Oracle術語2.1數(shù)據(jù)庫名數(shù)據(jù)庫名就是一個數(shù)據(jù)庫的標識,就像人的身份證號一樣。他用參數(shù)DB_NAME表示,如果一臺機器上裝了多全數(shù)據(jù)庫,那么每一個數(shù)據(jù)庫都有一個數(shù)據(jù)庫名。在數(shù)據(jù)庫安裝或創(chuàng)建完成之后,參數(shù)DB_NAME被寫入?yún)?shù)文件之中。格式如下:DB_NAME=myorcl...在創(chuàng)建數(shù)據(jù)庫時就應考慮好數(shù)據(jù)庫名,并且在創(chuàng)建完數(shù)據(jù)庫之后,數(shù)據(jù)庫名不宜修改,即使要修改也會很麻煩。因為,數(shù)據(jù)庫名還被寫入控制文件中,控制文件是以二進制型式存儲的,用戶無法修改控制文件的內(nèi)容。假設用戶修改了參數(shù)文件中的數(shù)據(jù)庫名,即修改DB_NAME的值。但是在Oracle啟動時,由于參數(shù)文件中的DB_NAME與控制文件中的數(shù)據(jù)庫名不一致,導致數(shù)據(jù)庫啟動失敗,將返回ORA-01103錯誤。Oracle術語2.1數(shù)據(jù)庫名36Oracle術語數(shù)據(jù)庫實例名與Oracle_SID一個數(shù)據(jù)庫實例(Instance)是由SGA,后臺進程以及數(shù)據(jù)文件組成,每個數(shù)據(jù)庫有自己的SGA和獨立的Oracle進程集。ORACLE_SID是操作系統(tǒng)的環(huán)境變量。兩者都是oracle實例,但兩者是有區(qū)別的。instance_name是oracle數(shù)據(jù)庫參數(shù),而ORACLD_SID用于與操作系統(tǒng)交互,也就是說,從操作系統(tǒng)的角度訪問實例名,必須通過ORACLE_SID。數(shù)據(jù)庫實例名除了與操作系統(tǒng)交互外,還用于網(wǎng)絡連接的oracle服務器標識。當你配置oracle主機連接串的時候,就需要指定0實例名。在winnt平臺,ORACLE_SID還需存在于注冊表中。在數(shù)據(jù)庫安裝之后,ORACLE_SID被用于定義數(shù)據(jù)庫參數(shù)文件的名稱。如:$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。Oracle術語數(shù)據(jù)庫實例名與Oracle_SID37Oracle術語2.3表空間一個Oracle數(shù)據(jù)庫由一個或多個邏輯存儲單元——表空間構成,表空間存儲著數(shù)據(jù)庫中所有的數(shù)據(jù);Oracle數(shù)據(jù)庫中的每個表空間由一個或多個文件組成,這些文件就是數(shù)據(jù)文件,它們是Oracle所在操作系統(tǒng)上的物理結構。Oracle數(shù)據(jù)庫中的所有數(shù)據(jù)物理的存儲在數(shù)據(jù)文件中。除了普通表空間外,Oracle還有幾種特殊的表空間。系統(tǒng)表空間(SYSTEM表空間)、UNDO表空間(回滾表空間)、臨時表空間(TEMP表空間)。系統(tǒng)表空間中除了保存數(shù)據(jù)字典外還保存所有的存儲過程、函數(shù)、包、觸發(fā)器和對象。UNDO表空間用于保存被DML語句影響的記錄的原始狀態(tài),以便在事務失敗的時候可以進行回滾。USER表空間TOOLS表空間當大的排序操作發(fā)生時,排序無法在內(nèi)存中完成,這時會使用臨時表空間。表空間可以設置為ONLINE和OFFLINE,OFFLINE的表空間無法進行訪問。通過對單獨表空間的ONLINE和OFFLINE,可以減少對系統(tǒng)的影響。表空間可以設置為READONLY和READWRITE兩種狀態(tài),只讀的表空間不可以進行鎖操作,因此甚至可以放到只讀設備上如CDROM。Oracle術語2.3表空間38Oracle術語同義詞同義詞用于屏蔽基表的身份,降低sql語句的復雜性,用戶不必知道同義詞所代表的表是哪一個表,從而用戶不需要指明表的所有者的名稱。同義詞有私有和公有之分。私有同義詞是普通用戶所創(chuàng)建的同義詞,只有創(chuàng)建該同義詞的用戶才能使用此同義詞,而公用同義詞是指數(shù)據(jù)庫管理員創(chuàng)建的,公用同義詞允許所有用戶使用。Oracle術語同義詞39Oracle術語序列建序列號主要用來自動產(chǎn)生數(shù)據(jù),如學生號自動加1,如果有很多的學生,比如10000個,那么使用序列較手工實現(xiàn)會提高效率。創(chuàng)建語法:createsequencenameincrementbyx//x為增長間隔startwithx//x為初始值maxvaluex//x為最大值minvaluex//x為最小值cycle//循環(huán)使用,到達最大值或者最小值時,重新建立對象cachex//制定緩存序列值的個數(shù)創(chuàng)建>createsequencesincrementby10startwith1nomaxvalue;刪除>dropsequences;使用>insertintoavalues(s.nextval,xxx);Oracle術語序列40Oracle基本操作創(chuàng)建表空間如何創(chuàng)建表空間創(chuàng)建表空間可以使用SQL語句,也可以通過DBAStudio。使用SYSTEM帳戶

droptablespacetestincludingcontents;//刪除表空間createtablespacetestlogging//datafile'd:\test.dbf'size100Mreuseautoextendonnext10Mmaxsizeunlimited;createtemporarytablespacetemptesttempfile'd:temptest.dbf'size10Mreuse;Oracle基本操作創(chuàng)建表空間41Oracle基本操作連接ORACLE

如何配置ORACLE客戶端如果Oracle服務器在另外一臺主機,你要連接到數(shù)據(jù)庫服務器。那么需要做的事情就是:在自己的機器安裝ORACLE客戶端。配置ORACLE連接:演示選擇”NetworkAdministration”--”Net8ConfigurationAssistant”進行配置Oracle基本操作連接ORACLE42Oracle基本操作常用的一些語句1.select*fromtab;查看當前表和視圖2.selectnamefromv$database;查看數(shù)據(jù)庫3.select*fromnls_database_parameters;查看數(shù)據(jù)庫參數(shù)設置4.select*fromuser_role_privs;查看當前用戶的角色5.selectusername,default_tablespace,temporary_tablespacefromuser_users;查看用戶名,默認/臨時表空間6.selectview_namefromuser_views;查看視圖7.selecttable_namefromuser_tables;查看表(和第1的區(qū)別)8.select*fromuser_constraints;查看表的約束情況9.select*fromuser_catalog查看表,視圖,同義詞和當前所有序列的簡明目錄Oracle基本操作常用的一些語句43Oracle中Join用法內(nèi)連接左連接右連接完全連接迪卡爾1.內(nèi)連接:選出兩個表中所有符合連接條件的row構成的集合。2.外連接,分為LEFT、RIGHT、FULL三種如有R與S做連接,那么LEFT是所有滿足條件的row以及所有在R屬性對應值在S中為NULL的集合。RIGHT是所有滿足條件的row以及所有在S屬性對應值在R中為NULL的集合FULL是所有滿足條件的row以及任何在R或S中出現(xiàn)NULL的集合Oracle中Join用法內(nèi)連接44Oracle中Join用法innerjoin(等值連接

只返回兩個表中聯(lián)結字段相等的行1.select

*

from

Table1a,Table2bwherea.id=b.id2.Select*fromtable1

A

INNERJOINtable2BONA.ID=B.IDOracle中Join用法innerjoin(等值連接45Oracle中Join用法leftjoin(左聯(lián)接)返回包括左表中的所有記錄和右表中聯(lián)結字段相等的記錄select

*

from

Table1

a,

table2

b

where

a.id=b.id(+);

SELECT*FROM

table1A

LEFTJOINtable2BONA.ID=B.IDOracle中Join用法leftjoin(左聯(lián)接)46Oracle中Join用法rightjoin(右聯(lián)接)

返回包括右表中的所有記錄和左表中聯(lián)結字段相等的記錄select

*

from

table1

a,

table2

b

where

a.id(+)=b.id;SELECT*FROM

table1A

RIGHTJOINtable2BONA.ID=B.IDOracle中Join用法rightjoin(右聯(lián)接)47Oracle中Join用法完全連接返回包括右表中的所有記錄和左表中的所有記錄select

*

from

table1

a,

table2

b

where

a.id=b.id(+)

union

select

*

from

Table1

a,

table2

b

where

a.id(+)=b.id;SELECT*FROM

table1A

FULLOUTERJOINtable2BONA.ID=B.IDOracle中Join用法完全連接48Oracle中Join用法迪卡爾

返回兩個表相等字段的乘積select

*

from

table1,

table2;Oracle中Join用法迪卡爾49Oracle異常處理1、異常的優(yōu)點如果沒有異常,在程序中,應當檢查每個命令的成功還是失敗。2、異常的分類有兩種類型的異常,一種為內(nèi)部異常,一種為用戶自定義異常。3、異常的拋出由三種方式拋出異常1.通過PL/SQL運行時引擎2.使用RAISE語句(RAISEexception_name;)3.調用RAISE_APPLICATION_ERROR存儲過程.定義DECLAREinventory_too_lowEXCEPTION;Oracle異常處理1、異常的優(yōu)點50Oracle異常處理4、異常的處理PL/SQL程序塊的異常部分包含了程序處理錯誤的代碼,當異常被拋出時,一個異常陷阱就自動發(fā)生,程序控制離開執(zhí)行部分轉入異常部分,一旦程序進入異常部分就不能再回到同一塊的執(zhí)行部分。下面是異常部分的一般語法:EXCEPTION

WHENexception_nameTHEN

Codeforhandingexception_name

[WHENanother_exceptionTHEN

Codeforhandinganother_exception]

[WHENothersTHEN

codeforhandinganyotherexception.]Oracle異常處理4、異常的處理51Oracle異常處理例子:declareexec_sql_errexception;var_msgvarchar(255);Beginupdatetable1setname=‘test’whereid=1;ifsql%notfoundthenraiseexec_sql_err;endif;Exceptionwhenothersthenwhenexec_sql_errthenvar_msg:=sqlcode||sqlerrm;dbms_output.put_line(var_msg);End;Oracle異常處理例子:52OracleUpdate用法關于ORACLE的UPDATE更新多表的問題一種是:

updatetable1set(field1,field2...)=(SelectField1,field2....fromtable2wheretable1.field1=table2.field1)wheretable1.field1in(selectfield1fromtable2)OracleUpdate用法關于ORACLE的UPDATE53OracleUpdate用法二種是:將table1,table2相關聯(lián)字段建立主鍵Primarykey或UnionkeyUpdate(SelectTable1.field1,table1.field2,table2.field1,table2.field2fromtable1,table2whereTable1.Field1=table2.field1)Settable1.table2=table2.table2,table1.fieldn=table2.tablen,......table1的Field1和table2的field1將需要建立主鍵或唯一索引才行OracleUpdate用法二種是:54OracleUpdate用法三種是:Oracle9i引入了MERGE命令,你能夠在一個SQL語句中對一個表同時執(zhí)行inserts和updates操作.MERGE命令從一個或多個數(shù)據(jù)源中選擇行來updating或inserting到一個或多個表.Oracle10g中MERGE有如下一些改進:1、UPDATE或INSERT子句是可選的2、UPDATE和INSERT子句可以加WHERE子句3、ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連接源表和目標表mergeintotable1usingtable2on(table1.field1=table2.field1and....)whenmatchedthenUpdatesettable1.field2=table2.field2,table1.fieldn=table2.fieldn,......whennotmatchedthen[doingotherthing]其余方法可使用游標;OracleUpdate用法三種是:55OracleSQL優(yōu)化1、選擇最有效率的表名順序例如:

TAB116,384條記錄

TAB21條記錄

選擇TAB2作為基礎表

(最好的方法)selectcount(*)fromtab1,tab2執(zhí)行時間0.96秒

選擇TAB2作為基礎表

(不佳的方法)selectcount(*)fromtab2,tab1執(zhí)行時間26.09秒如果有3個以上的表連接查詢,那就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所引用的表OracleSQL優(yōu)化1、選擇最有效率的表名順序56OracleSQL優(yōu)化2、WHERE子句中的連接順序

ORACLE采用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論