Oracle相關總結
Oracle相關總結
一、測試oracle安裝是否成功
安裝完Oracle如何驗證安裝是否成功呢?下面介紹測試方法:
1.執(zhí)行操作系統(tǒng)級命令:tnspingorcl(假定全局數(shù)據(jù)庫名為orcl)結果如下:
結果出現(xiàn)OK,說明偵聽器配置無誤,繼續(xù)第2步。如果沒有出現(xiàn)上圖結果,請檢查:
1)使用OracleNetConfigurationAssistant檢查網(wǎng)絡配置(netca命令);2)使用DatabaseConfigurationAssistant檢查數(shù)據(jù)庫配置(dbca命令)。
2.執(zhí)行操作系統(tǒng)級的命令:sqlplussys/root@orclassysdba連接成功后輸入測試sql語句:select1+2+3sumfromdual;結果如下:
如果結果正確,表明數(shù)據(jù)庫例程安裝和啟動正常?梢蚤_始用剛安裝完的Oracle開始其他工作。
二、新建用戶、表空間并分配權限
Oracle安裝完后,其中有一個缺省的數(shù)據(jù)庫,除了這個缺省的數(shù)據(jù)庫外,我們還可以創(chuàng)建自己的數(shù)據(jù)庫。創(chuàng)建完數(shù)據(jù)庫后,并不能立即在數(shù)據(jù)庫中建表,必須先創(chuàng)建該數(shù)據(jù)庫的用戶,并且為該用戶指定表空間。
明確要在哪個數(shù)據(jù)庫下建立用戶、表空間,就先用dba權限的用戶(sys,system等)登錄該數(shù)據(jù)庫,再進行以下操作。
1.查找所有數(shù)據(jù)庫文件存放的路徑,可根據(jù)查到的路徑定自己新建表空間數(shù)據(jù)文件存放的路徑。(當然也可以自己定路徑,不必參照,可略過此步)select*fromdba_data_files;2.創(chuàng)建表空間
createtablespaceorcl_VoicedReading--表空間名Datafile--數(shù)據(jù)庫文件保存路徑
"C:\\ORACLE\\PRODUCT\\10.2.0\\ORADATA\\ORCL\\orcl_VoicedReading.dbf"size100M--大小autoextendon;create
userwyli-用戶名
identifiedbyroot--密碼
defaulttablespaceorcl_VoicedReading;--指定默認表空間4.分配權限
--自動增長
3.創(chuàng)建用戶并指定表空間
grantdbatowyli;--分配dba權限給用戶wyli
到此,為數(shù)據(jù)庫新建用戶完成,可以用新建的用戶以normal身份登錄,然后開始在數(shù)據(jù)庫上做建表等工作。
三、寫Oracle存儲過程要注意的問題
1.在oracle中,數(shù)據(jù)表別名不能加as,如:selecta.appnamefromappinfoa;--正確selecta.appnamefromappinfoasa;--錯誤
2.在存儲過程中,select某一字段時,后面必須緊跟into,如果select整個記錄,利用游標的話就另當別論了。
selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;--有into,正確編譯
selectaf.keynodefromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;
--沒有into,編譯報錯,提示:Compilation
3.在利用select...into...語法時,必須先確保數(shù)據(jù)庫中有該條記錄,否則會報出"no
datafound"異常。
可以在該語法之前,先利用selectcount(*)from查看數(shù)據(jù)庫中是否存在該記錄,如果存在,再利用select...into...
4.在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運行階段會報錯selectkeynodeintoknfromAPPFOUNDATIONwhereappid=aidandfoundationid=fid;--正確運行
selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=appidandaf.foundationid=foundationid;
5.在存儲過程中,關于出現(xiàn)null的問題假設有一個表A,定義如下:createtableA(
idvarchar2(50)primarykeynotnull,vcountnumber(8)notnull,
bidvarchar2(50)notnull--外鍵);
如果在存儲過程中,使用如下語句:
selectsum(vcount)intofcountfromAwherebid="xxxxxx";如果A表中不存在bid="xxxxxx"的記錄,則fcount=null(即使fcount定義時設置了默認值,如:fcountnumber(8):=0依然無效,fcount還是會變成null),這樣以后使用fcount時就可能有問題,所以在這里最好先判斷一下:iffcountisnullthenfcount:=0;endif;
--運行階段報錯
四、企業(yè)庫連接Oracle
企業(yè)庫(3.1)連接Oracle
命名空間Microsoft.Practices.EnterpriseLibrary.Data;中的DatabaseFactory類提供兩個方法來創(chuàng)建database對象。
1.用方法DatabaseFactory.CreateDatabase(string)
配置文件:
示例代碼:
usingMicrosoft.Practices.EnterpriseLibrary.Data;usingSystem.Data.Common;publicboolIsExistBackgroundMusic(stringbgMusicName){//創(chuàng)建database實例Databasedb=DatabaseFactory.CreateDatabase("Oracle");stringproduceName="proce_BackgroundMusic_Exist";DbCommandcommand=db.GetStoredProcCommand(produceName);//為command提供參數(shù)db.AddInParameter(command,"ParamBackgroundMusicName",DbType.String,bgMusicName);db.AddOutParameter(command,"outCount",DbType.Int32,4);//執(zhí)行存儲過程db.ExecuteScalar(command);intoutCount=(int)db.GetParameterValue(command,"outCount");if(outCount==0){returnfalse;}returntrue;}
2.用方法DatabaseFactory.CreateDatabase()
配置文件:
示例代碼:
usingMicrosoft.Practices.EnterpriseLibrary.Data;usingSystem.Data.Common;publicboolIsExistBackgroundMusic(stringbgMusicName){Databasedb=DatabaseFactory.CreateDatabase();stringproduceName="proce_BackgroundMusic_Exist";DbCommandcommand=db.GetStoredProcCommand(produceName);db.AddInParameter(command,"ParamBackgroundMusicName",bgMusicName);db.AddOutParameter(command,"outCount",DbType.Int32,4);db.ExecuteScalar(command);intoutCount=(int)db.GetParameterValue(command,"outCount");if(outCount==0){returnfalse;}returntrue;}
DbType.String,
擴展閱讀:Oracle知識點總結
Oracle知識點總結
根據(jù)閻赫老師講義整理Zealjiang1、Oracle數(shù)據(jù)庫的安裝和配置⑴OracleInternet級數(shù)據(jù)庫SQLServer中小企業(yè)級數(shù)據(jù)庫Access桌面級數(shù)據(jù)庫⑵Oracle的安裝
注意:來源和目標的目錄不允許有中文或空格⑶Oracle數(shù)據(jù)庫啟動時必需開啟的后臺服務
①OracleOrahome90TNSListener使第三方的軟件或語言訪問②OracleServiceETCOracle的實例CRUD增刪改查注意:②中的ETC是你起的實例的名字⑷Oracle的開發(fā)工具
①DOS界面的開發(fā)平臺->運行->sqlplus②Oracle本身基于DOS的平臺->運行->sqlplusw③OracleEnterpriseManagerConsole④PL/SQLDeveloper7.1.5⑸創(chuàng)建一個表的完整流程①創(chuàng)建一個數(shù)數(shù)庫
例子:創(chuàng)建一個數(shù)據(jù)庫ETC,物理文件放在F:\\,初始化1m,自增長開啟
createtablespaceetcdatafile"f:\\etc.dbf"size1mautoextendon;
刪除表空間
droptablespace數(shù)據(jù)庫名稱;②為該數(shù)據(jù)庫創(chuàng)建一個帳號和密碼語法:createuser用戶名稱identifiedby密碼
defaulttablespace數(shù)據(jù)庫名稱
注意:1、在Oracle中賬號和數(shù)據(jù)庫one2one綁定2、Oracle的密碼不允許為純數(shù)字或空3、需要在system賬號完成動作修改Oracle的賬號密碼語法:alteruser用戶identifiedby新密碼③用grant權限to用戶為該帳戶授權語法:grant權限名稱to用戶;撤銷權限
語法:revoke權限名稱from用戶名;④在該帳號下創(chuàng)建表⑹Oracle中的事務處理Transacation事務
特點:整體提交(commit)整體回滾(rollback)事務的四個特性
①原子性不可分割
②持久性->當數(shù)據(jù)整整寫入到數(shù)據(jù)庫物理文件中后,該數(shù)據(jù)被持久化
③隔離性->事務之間相互獨立互不干擾④一致性->數(shù)據(jù)安全⑺Oracle中的保留點(還原點)關鍵字:savepoint使用方法:savepoint名稱;如進行保留點回滾rollbacktomark2⑻Oracle備份數(shù)據(jù)表數(shù)據(jù)
①createtable備份表名稱as查詢語句;②Oracle備份表結構
createtableemp_bakasselect*fromempwhere1=2;2、Oracle的函數(shù)
⑴function(系統(tǒng)預定義函數(shù))
函數(shù)和存儲過程相比,在于函數(shù)必須有返回值,而存儲過程只有輸出參數(shù)。語法:createorreplacefunction函數(shù)名稱return返回類型as
PL/SQL語句塊
例子:輸入一個員工工號,返回該員工所在部門平均工資
createorreplacefunctionfun_demo1(enoemp.empno%type)returnemp.sal%typeas
avgsalemp.sal%type;begin
selectavg(sal)intoavgsalfromempwhereempno=eno;returnavgsal;end;
調用:selectfun_demo1(7788)fromdual;
publicintadd(intnum1,intnum2){intres=0;res=num1+num2;returnres;}
⑵單行函數(shù)(單值函數(shù)):函數(shù)有且只有返回1個值|-字符函數(shù)substrinstr①字符串連接函數(shù):concatconcat(字符串1,字符串2)Oracle中字符連接操作符號"||"
②字符串對齊函數(shù):lpad->leftpadding左填充/rpad語法:lpad(字符串,預留位置,填充字符)
SQL:selectlpad(ename,10,"")fromemp;③字符串截取函數(shù):substr->substring
語法:substr(字符串,截取的起始位置,截取個數(shù))substr(字符串,截取的起始位置)SQL:>selectsubstr(ename,1,3)fromeemp;④字符查找函數(shù):instr->innerstring
語法:instr(字符串,待找的字符,查找的起始位置,出現(xiàn)次數(shù))SQL:>selectename,instr(ename,"T",1,1)fromemp;注意:當返回值為0時,字符不存在⑤函數(shù):initcap->initialcaptor語法:initcap(字符串)
SQL:>selectinitcap(ename)fromemp;⑥函數(shù):length
語法:length(字符串)
SQL:>select*fromempwherelength(ename)=5;⑦函數(shù):lower/upper語法:lower(字符串)SQL:>selectlower(ename)fromemp;
|-日期函數(shù)sysdateadd_months①函數(shù):sysdate
SQL:>selectsysdatefromdual;dual-無實際意義,函數(shù)測試或其他測試使用
②月份差:months_between
語法:months_between(日期1,日期2)SQL:>select*fromempwheremonths_between(sysdate,hiredate)>=144③函數(shù):last_day
語法:last_day(日期數(shù)據(jù))SQL:>select*fromempwherelast_day(hiredate)-2=hiredate;④函數(shù):add_months
語法:add_months(時間,添加月份)
SQL:>selectadd_months(sysdate,3)fromdual;|-轉換函數(shù)to_charto_date①轉換函數(shù)to_char
語法:to_char(時間數(shù)據(jù),制定格式)
SQL:>selectto_char(sysdate,"yyyy-mm-ddhh24:mi:ssddddday")fromdual;yyyy-mm-dd年月日hh24:mi:ss時分秒(24)d一周第幾天ddd一年的第幾天day星期幾
②to_date:將文本類型數(shù)據(jù)按照制定格式轉換成時間類型數(shù)據(jù)語法:to_date("具體的時間字符數(shù)據(jù)","時間字符串格式")to_date("201*-01-19","yyyy-mm-dd")注意:Oracle中的date字段類型及其特殊|-數(shù)學函數(shù)absceilfloorabs(n)絕對值
ceil(n)向上取值ceilling天花板ceil(1.1)->2floor(n)向下取值floor地板floor(2.9)->2mod(m,n)求模取余mod(5,2)->1power(m,n)m的n次方power(2,8)->256
round(m,n)四舍五入m待處理數(shù)據(jù)n精度round(3.1415,2)->3.14
trunc(m)整數(shù)截取trunc(3.1415)=3sign(m)符號sqrt(m)平方根|-混合函數(shù)usernvl①user:返回當前登錄賬號SQL>selectuserfromdual;②nvl:替空函數(shù)
語法:nvl(字符串,替換后的數(shù)據(jù))
注意:替換后的數(shù)據(jù)必須與該字段類型保持一致SQL>selectename,nvl(comm,0)fromemp;
⑶分析函數(shù):數(shù)據(jù)分析和挖掘功能DataMiningrankdense_rank作用:主要用于排名使用函數(shù):rank
①語法:rank()over(orderby字段名稱)
SQL:>selectrank()over(orderbysaldesc),ename,salfromemp;若排名相同下一個將跳轉
SQL:>selectdense_rank()over(orderbysaldesc),ename,salfromemp;連續(xù)
②語法:rank(參數(shù)1,參數(shù)2)withingroup(orderby字段1,字段2)
SQL:>selectename,rank(2850,"BLAKE")withingroup(orderbysal,ename)fromemp;
⑷分組函數(shù):類似于SQLServer中的聚合函數(shù)sumavgcountgroupby分組關鍵字having條件3、Oracle數(shù)據(jù)庫的查詢⑴制定區(qū)間查詢
Oracle中偽列:Oracle為每張數(shù)據(jù)表(包括用戶自定義創(chuàng)建的數(shù)據(jù)表)都自動創(chuàng)建兩個位列分別是:rowid、rownum通過命令:SQL>desc表名;--查看表結構rowid:由18個字符組成唯一標識每一行rownum:行號
⑵介紹問題:使用Oracle分層查詢以數(shù)據(jù)結構顯示emp表中的人員關系語法:selectlpad(ename,level*5,"")fromempconnectbypriorempno=mgrstartwithmgrisnull;
⑶并集:查詢部門10的辦事員和部門20的經(jīng)理關鍵字:unionall
select*fromempwheredeptno=10andjob="CLERK"unionall
select*fromempwheredeptno=20andjob="MANAGER";
注意:unionall不會消除查詢結果中的重復數(shù)據(jù),union會消除查詢結果中的重復記錄
⑷交集:查詢部門10和部門20都有的工作類型關鍵字:intersect
selectjobfromempwheredeptno=10intersect
selectjobfromempwheredeptno=20;
⑸差集:查詢部門30中有,而部門10中沒有的工作類型關鍵字:minusselectjobfromempwheredeptno=30minus
selectjobfromempwheredeptno=10;
4、Oracle數(shù)據(jù)庫的數(shù)據(jù)對象
Oracle的數(shù)據(jù)庫對象:用戶、表、約束、序列、視圖、同義詞和索引定義:但凡使用"create"開頭創(chuàng)建的對象稱之為數(shù)據(jù)庫對象。⑴鎖定/解除用戶
語法:alteruser用戶名稱accountlock;注意:該指令一般在system賬號下輸入解除用戶鎖定
語法:alteruser用戶名稱accountunlock;SQL>alteruserscottaccountunlock;
注意:Oracle11g中scott賬號是默認鎖定的,需要進行解鎖處理。⑵用戶授權/撤銷
grant權限名稱to用戶名稱;撤銷用戶權限
revoke權限名稱from用戶名;⑶表
數(shù)據(jù)字段的類型①數(shù)字類型:number語法:number(長度,精度)number(5,2)數(shù)字長度為3,精度為2范圍:-999.99~999.99number(5)數(shù)字長度為5,精度為0范圍:-99999~99999number精度默認為0范圍:-32767~32768②字符類型:varchar2可變長度char字符類型語法:varchar2(長度)③日期類型:date
④long數(shù)據(jù)類型:該字段最大存儲空間為2GB,該字段不允許添加索引
LOB數(shù)據(jù)類型:該字段最大存儲空間為4GB,該字段不允許添加索引CLOB:大字符類型->文章(小說,cnki)
BLOB:大二進制類型->圖片、音頻、視頻.....多媒體文件FLOB:文件定位器->內存指針⑷創(chuàng)建數(shù)據(jù)表的語法結構:createtable表名(
字段名稱1類型[約束],字段名稱1類型[約束],
字段名稱n類型[約束])
①使用desc表名查看表結構②給表添加字段address和telephone語法:altertable表名add(字段名稱類型);③刪除表字段address
語法:altertable表名dropcolumn字段名稱;④修改表中已有字段的類型
語法:altertable表名modify(字段名稱新類型);⑤修改表名稱
語法:rename原表名to新表名;約束
完整性約束=準確性+一致性⑸約束的四大分類:
①實體完整性約束(行約束)->盡量減少數(shù)據(jù)表中數(shù)據(jù)的冗余(重復的數(shù)據(jù))
技術實施:主鍵約束、唯一約束
語法:altertable表名addprimarykey(字段名稱);altettable表名addunique(字段名稱);添加非空約束
語法:altertable表名modify(字段名稱notnull);
②域完整性約束(列約束)->達到數(shù)據(jù)的準確性,控制數(shù)據(jù)的大小或范圍或格式
技術實施:check檢查約束
altertable表名addconstraint約束名稱check(條件);③引用完整性約束(表間約束)->達到數(shù)據(jù)的一致性技術實施:外鍵約束添加外鍵約束
altertable外鍵表addconstraint約束名稱foreignkey(外鍵字段)references主鍵表(主鍵字段);刪除外鍵約束
語法:altertable表名dropconstraint約束名稱;刪除匿名約束
語法:altertable表名modify(字段名稱null);
④自定義完整性約束->以上三種數(shù)據(jù)庫內置約束不能滿足開發(fā)人員的需求是,需要開發(fā)人員自定一些約束條件技術實施:觸發(fā)器⑹使用sql腳本批量插入數(shù)據(jù)使用命令SQL>@路徑+文件名稱SQL>@f:/a.sql;⑺序列
定義:Oracle中使用sequence來實現(xiàn)字段的自增長功能,和SQLServer中的identity屬性類型語法:createsequence序列名稱startwith起始數(shù)字incrementby增長量;
用法:序列對象通過兩個重要的屬性進行訪問取值.nextval->nextvalue->下一個值例子:selectseq_1.nextvalfromdual;.currval->currentvalue->當前值例子:selectseq_1.currvalfromdual;如何實現(xiàn)其自增長功能
通過語法結構將序列對象與對應的數(shù)據(jù)表進行綁定,實現(xiàn)其自增長功能。
例子:createtableusers(useridnumber(2),usernamevarchar2(10));
createsequenceseq_usersstartwith1incrementby1;insertintousersvalues(seq_users.nextval,"alvin");注意:Oracle建議一個序列對象盡與一張數(shù)據(jù)表進行綁定技巧:createsequence序列名稱;默認從1每次增長1⑻視圖
作用:1、簡化復雜的SQL語句2、提高數(shù)據(jù)的訪問安全性語法:createorreplaceview視圖名稱as
復雜的SQL查詢語句
視圖是一張?zhí)摂M的數(shù)據(jù)表,在Table對象中不存在,只存在于內存中注意:若視圖由1張基表組成,修改視圖將會修改基表數(shù)據(jù),若視圖由多張表組成,則不會修改基表數(shù)據(jù)⑼同義詞
作用:Oracle中的同義詞提供各種數(shù)據(jù)庫對象(表)的別名,目的在于提高數(shù)據(jù)表訪問的安全性,尤其多用戶并發(fā)訪問時。語法:createsynonym表的別名for表名;SQL>createsynonymbak1foremp;擴展:公有同義詞public
語法:createpublicsynonym別名for表名;⑽索引
作用:提高SQL查詢語句按照制定字段查詢的效率語法:createindex索引的名稱on數(shù)據(jù)表(字段)
例子:為hiredate字段添加索引,提高按日期查詢的SQL語句的效率
createindexidx_hireonemp(hiredate)原理:空間換效率SQL語句索引優(yōu)化規(guī)則
①不帶where條件的SQL語句一定不能使用索引②在where條件中有索引的字段不能使用函數(shù)例子:假設我們查詢在1987年參加工作的所有員工
SQL>select*fromempwhereto_char(hiredate,"yyyy")="1987";SQL>select*fromempwherehiredate=to_date("1987","yyyy");③在where條件中有索引的字段不能參與運算例子:查詢在10000天以前參加工作的員工信息SQL>select*fromempwheresysdate-hiredate>10000;SQL>select*fromempwherehiredateselecte.*,d.dnamefromempe,deptdwheree.deptno=d.deptnoandd.dname="ACCOUNTING";⑾Oracle中常用的數(shù)據(jù)字典
Oracle是以中以表管表的模式,同時數(shù)據(jù)字典是有表或視圖組成。數(shù)據(jù)字典的分類:
USER_xxx:表示當前用戶所擁有的數(shù)據(jù)庫對象ALL_xxxx:表示當前用戶與權力查看的數(shù)據(jù)庫對象
DBA_xxxx:表示數(shù)據(jù)中所擁有的全部對象,只有在超級管理員級別下才可查看。
xxxx:代表數(shù)據(jù)庫對象的復數(shù)形式,例如:tablesindexes.......
5、Oracle數(shù)據(jù)庫的多表查詢
⑴等連接:selectemp.ename,dept.dnamefromemp,deptwhereemp.deptno=dept.deptno;使用內連接模式編寫:⑵內連接:innerjoin......on......
selectemp.ename,dept.dnamefromempinnerjoindeptonemp.deptno=dept.deptno;
分析:部門為主顯示字段,dept為主表姓名為輔助顯示字段,emp為輔助表
⑶外連接:selectd.dname,e.enamefromempe,deptdwheree.deptno(+)=d.deptno;
6、Oracle數(shù)據(jù)庫的游標游標cursor
游標的分類:隱式游標:Oracle自動應以一個隱式游標名稱為SQL,該游標不被程序員控制,自動開啟、操作及結束。顯式游標:可供程序員自己創(chuàng)建及操作|---靜態(tài)游標|---動態(tài)游標⑴靜態(tài)游標loop循環(huán)游標/for循環(huán)游標
====loop循環(huán)游標=====步驟1:創(chuàng)建一個游標
cursor游標名稱isSQL查詢語句;
步驟2:開啟游標
open游標名稱;->執(zhí)行定義的SQL查詢語句并將結果集合存放到游標中
步驟3:使用loop循環(huán)遍歷游標中的數(shù)據(jù)并進行相應處理loop
fetch游標名稱into變量;exitwhen游標名稱%notfound;.....endloop;步驟4:關閉游標close游標名稱;
例子:顯示部門編號為10的員工姓名declare
--步驟1:創(chuàng)建一個游標
cursormycurisselectenamefromempwheredeptno=10;enemp.ename%type;begin
--步驟2:開啟游標openmycur;
--步驟3:使用loop循環(huán)遍歷游標中的數(shù)據(jù)并進行相應處理loop
fetchmycurintoen;exitwhenmycur%notfound;dbms_output.put_line(en);endloop;
--步驟4:關閉游標closemycur;end;
=======for循環(huán)游標=======declare
--步驟1:創(chuàng)建一個游標
cursormycurisselect*fromempwheredeptno=10;erowemp%rowtype;begin
--步驟3:使用for循環(huán)遍歷游標中的數(shù)據(jù)并進行相應處理forerowinmycurloopdbms_output.put_line(erow.ename);endloop;end;
⑵動態(tài)游標(擴展)
作用:使用游標變量高度重用(只能使用loop循環(huán))語法結構:
步驟1:聲明一個動態(tài)游標類型type類型名稱isrefcursor;
步驟2:使用聲明號的類型創(chuàng)建一個游標變量游標名稱類型名稱;
步驟3:打開游標并且綁定SQL語句open游標名稱forSQL查詢語句
步驟4:使用循環(huán)遍歷游標中的數(shù)據(jù)并進行處理loop
fetch游標名稱into變量;exitwhen游標名稱%notfound.....數(shù)據(jù)處理......endloop;步驟5:重復3~步驟6:關閉游標close游標名稱;
例子:顯示部門30的員工姓名及dept表中全部部門名稱declare
--聲明一個游標類型typecurisrefcursor;--聲明游標變量mycurcur;--聲明變量erowemp%rowtype;drowdept%rowtype;begin--打開游標
openmycurforselect*fromempwheredeptno=30;loop
fetchmycurintoerow;exitwhenmycur%notfound;
dbms_output.put_line(erow.ename);endloop;
dbms_output.put_line("============");--打開游標
openmycurforselect*fromdept;loop
fetchmycurintodrow;exitwhenmycur%notfound;
dbms_output.put_line(drow.dname);endloop;--關閉游標closemycur;end;
⑶游標所有屬性游標名稱%屬性名稱屬性名稱含義
notfound當游標中沒有遍歷的數(shù)據(jù)時返回1found當游標中存在有遍歷的數(shù)據(jù)時返回1isopen當游標開啟狀態(tài)時返回1rowcount返回游標影響行數(shù)
7、Oracle數(shù)據(jù)的PL/SQL⑴PL/SQL塊
語法格式:declare聲明
......變量聲明區(qū)begin程序開始......執(zhí)行語句區(qū)exception異常處理部分.....
end;程序結束;①變量的聲明
標量標識符,不區(qū)分大小寫,先聲明再使用變量聲明的語法結構:標量名稱類型;例子:declare
enonumber(4);edatedate;beginend;②★屬性引用類型|-字段引用類型例子:declareenoemp.ename%type;|-行引用類型例子:declareerowemp%rowtype;③變量的賦值四種方式:◆聲明時賦值賦值運算符“:=”
例子:聲明一個變量賦值為2declare
num1number(2):=2;.....begin
.....end;◆執(zhí)行區(qū)賦值
例子:聲明一個變量賦值為2declare
num1number(2);.....beginnum1:=2;.....end;
◆對話框賦值->程序與用戶之間進行數(shù)據(jù)交互例子:聲明一個變量賦值為2declare
num1number(2);.....begin
num1:=&請輸入數(shù)字;.....end;
注意點:當輸入字符串類型數(shù)據(jù)的使用書寫格式為:name:="&姓名";當輸入數(shù)字類型數(shù)據(jù)的使用書寫格式為:age:=&年齡;◆select....into....賦值模式
例子:將emp表中simth的工資復制到變量esal中declare
esalemp.sal%type;begin
selectsalintoesalfromempwhereename="SMITH";end;
④Oracle的PL/SQL中屏幕輸出語句
語法:dbms_output.put_line("xxxxxxx");將信息輸出并換行dbms_output.put("xxxxxxx");輸出不換行
注意:Oracle默認關閉屏幕輸出功能,需要開發(fā)人員輸入指令將其功能開啟
SQL>setserveroutputon;⑤PL/SQL中的異常處理語法:exception
when異常名稱then....處理方式.....異常:others->任何異常都可捕獲⑵執(zhí)行語句部分
①循環(huán)的使用:forwhileloop
for語法結構:for循環(huán)變量in起始數(shù)字..結束數(shù)字loop
....循環(huán)體....endloop;
例子1:顯示數(shù)字10~1(reverse)declareinumber;begin
foriinreverse1..10loop
dbms_output.put_line(i);endloop;end;
例子1:顯示乘法口訣declareinumber;jnumber;begin
--外層循環(huán)控制行數(shù)foriin1..9loop
--內層循環(huán)控制個數(shù)forjin1..iloop
dbms_output.put(j||"*"||i||"="||i*j||"");endloop;--換行
dbms_output.put_line("");endloop;end;
②while循環(huán)
語法:while進入條件loop
....循環(huán)體.....endloop;③loop循環(huán)語法:loopexitwhen推出條件;...循環(huán)體....endloop;⑶條件判斷
語法:if條件thenelsif條件thenelseendif;
例子:模擬一個登錄結構,用戶名為admin密碼為chinasoftdeclare
usernamevarchar2(10);passwordvarchar2(10);begin
--用戶輸入賬號及密碼username:="&賬號";password:="&密碼";--邏輯判斷
ifusername="admin"andpassword="chinasoft"thendbms_output.put_line("歡迎登錄:"||username);else
dbms_output.put_line("賬號或密碼錯誤!");endif;end;
⑷處理自定義異常
例子:若用戶輸入的數(shù)字不再1~10之內則拋出異常
步驟1:創(chuàng)建一個異常對象在變量聲明區(qū)輸入一下代碼
expexception;--聲明一個異常對象,名稱為exp步驟2:編寫條件判斷結構拋出異常在語句執(zhí)行區(qū)編寫一下代碼if.....then
raise異常對象名稱;--拋出異常endif;步驟3:異常捕獲在語句執(zhí)行區(qū)編寫exception
when異常對象名稱then......處理方式........declare
nnumber;--用來接收用戶輸入的數(shù)字expexception;--創(chuàng)建一個異常對象beginn:=&數(shù)字;--判斷
ifn10thenraiseexp;--拋出異常endif;
dbms_output.put_line(n);exceptionwhenexpthen
dbms_output.put_line("數(shù)字范圍不再1~10之內");end;⑸
8、Oracle數(shù)據(jù)庫中的存儲過程、函數(shù)、數(shù)據(jù)包⑴Oracle中的存儲過程
Oracle中的PL/SQL語句塊,沒有名字,成為匿名的PL/SQL塊,代碼重用性低。需要為PL/SQL塊起名字,起名后的PL/SQL塊統(tǒng)稱為子程序。子程序的分類:存儲過程、自定義函數(shù)①存儲過程
語法:createorreplaceprocedure存儲過程名稱as
PL/SQL塊②如何調用存儲過程
兩種方式:1、指令方式->exec存儲過程名稱;2、使用PL/SQL塊調用begin
存儲過程名稱;end;③帶參數(shù)的存儲過程兩大類:a)帶輸入?yún)?shù)b)帶輸出參數(shù)
a)帶輸入?yún)?shù)的存儲過程
語法:createorreplaceprocedure存儲過程名稱(參數(shù)名稱1in類型,....,參數(shù)名稱n類型)as
PL/SQL塊b)帶輸出參數(shù)的存儲過程
語法:createorreplaceprocedure存儲過程名稱(參數(shù)名稱1out類型,....,參數(shù)名稱nout類型)as
PL/SQL塊例子:顯示部門10的平均工資(使用輸出參數(shù))
createorreplaceprocedurepro_demo3(avgsaloutemp.sal%type)asbegin
selectavg(sal)intoavgsalfromempwheredeptno=10;end;
調用:只能使用PL/SQL塊declare
getsalemp.sal%type;begin
pro_demo3(getsal);
dbms_output.put_line(getsal);end;
/1、輸入指定員工的員工編號,輸出其所在部門的其他姓名(存儲過程、帶參數(shù)的游標、輸入?yún)?shù))
思路:*1、使用SQL語句查詢7788員工所在部門的其他員工信息select*fromempwheredeptno=(selectdeptnofromempwhereempno=7788)andempno7788;*2、修改成PL/SQL塊declare
cursormycur(enoemp.empno%type)isselect*fromempwheredeptno=(selectdeptnofromempwhereempno=eno)andempnoeno;erowemp%rowtype;tmpemp.empno%type;begintmp:=&工號;
forerowinmycur(tmp)loop
dbms_output.put_line(erow.ename);endloop;end;
*3、修改成為存儲過程
createorreplaceprocedurepro_demo4(tmpemp.empno%type)as
cursormycur(enoemp.empno%type)isselect*fromempwheredeptno=(selectdeptnofromempwhereempno=eno)andempnoeno;erowemp%rowtype;begin
forerowinmycur(tmp)loop
dbms_output.put_line(erow.ename);endloop;end;*4、調用
execpro_demo4(7788);
/2、輸出制定員工所在部門的平均工資(存儲過程、輸入?yún)?shù)、輸出參數(shù))思路:*1、編寫SQL語句
selectavg(sal)fromempwheredeptno=(selectdeptnofromempwhereempno=7788)*2、PL/SQL語句declare
enoemp.empno%type;esalemp.sal%type;begineno:=&編號;
selectavg(sal)intoesalfromempwheredeptno=(selectdeptnofromempwhereempno=eno);dbms_output.put_line(esal);end;*3、修改為存儲過程
createorreplaceprocedurepro_demo5(enoinemp.empno%type,esaloutemp.sal%type)asbeginselectavg(sal)intoesalfromempwheredeptno=(selectdeptnofromempwhereempno=eno);end;*4、調用declare
tmpemp.sal%type;begin
pro_demo5(7788,tmp);dbms_output.put_line(tmp);end;⑵程序包
程序包是一個函數(shù)或存儲過程的集合。程序包的結構:第一部分:程序包的聲明createorreplacepackage包名稱as
存儲過程的聲明;自定義函數(shù)的聲明;end;
第二部分:程序包主體
createorreplacepackagebody包名稱as存儲過程的實現(xiàn);自定義函數(shù)的實現(xiàn);
例子:完成對EMP表進行增刪改的操作part1:
createorreplacepackageemp_pack
procedureadd_emp(enoemp.empno%type,enmemp.ename%type,dnoemp.deptno%type);
procedureupdate_emp(enoemp.empno%type,esalemp.sal%type);proceduredelete_emp(enoemp.empno%type);end;part2:
createorreplacepackagebodyemp_packas--添加
procedureadd_emp(enoemp.empno%type,enmemp.ename%type,dnoemp.deptno%type)asbegin
insertintoemp(empno,ename,sal)values(eno,enm,dno);dbms_output.put_line("addisok");end;--修改procedureupdate_emp(enoemp.empno%type,esalemp.sal%type)asbegin
updateempsetsal=esalwhereempno=eno;dbms_output.put_line("updateisok");end;--刪除
proceduredelete_emp(enoemp.empno%type)asbegin
deletefromempwhereempno=eno;dbms_output.put_line("deleteisok");end;end;
如何調用exec程序包名稱.過程名稱(參數(shù));select程序包名稱.函數(shù)名稱(參數(shù))fromdual;⑶觸發(fā)器
關鍵字:trigger->扳機、目標當需要級聯(lián)操作的時候可能用到觸發(fā)器語法:createorreplacetrigger觸發(fā)器名稱
before|afterinsertorupdateordelete[of字段名稱]on表begin
PL/SQL語語句
案例:當對Emp進行CUD操作時候后經(jīng)行出發(fā)createorreplacetriggertri_empafterinsertorupdateordeleteonempbegin
ifinsertingthen
dbms_output.put_line("addisok");elsifupdatingthen
dbms_output.put_line("updateisok");else
dbms_output.put_line("deleteisok");endif;end;
觸發(fā)器的分類:分為:表級觸發(fā)
行及觸發(fā)foreachrow
例子:更新Emp表中部門為10的員工工資表級觸發(fā)
createorreplacetriggertri_demo1afterupdateonempbegin
ifupdatingthen
dbms_output.put_line("更新isok");endif;end;行級觸發(fā)
createorreplacetriggertri_demo1afterupdateonempforeachrowbegin
ifupdatingthen
dbms_output.put_line(:old.empno||"更新isok");endif;end;
在觸發(fā)器中:old代表原數(shù)據(jù)對象(一行對象),:new代表新的數(shù)據(jù)對象
案例:刪除Emp中指定數(shù)據(jù)的時候,將刪除的數(shù)據(jù)自動備份到另外一張表中。
步驟1:創(chuàng)建一張備份表createtableemp_bak2asselect*fromempwhere1=2;步驟2:編寫觸發(fā)器自動完成數(shù)據(jù)備份功能createorreplacetriggertri_demo2beforedeleteonempforeachrowbegin
insertintoemp_bak2
values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
dbms_output.put_line("數(shù)據(jù)備份成功");end;
9、Oracle數(shù)據(jù)庫中的備份與還原10、Oracle數(shù)據(jù)庫優(yōu)化
友情提示:本文中關于《Oracle相關總結》給出的范例僅供您參考拓展思維使用,Oracle相關總結:該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡整理 免責聲明:本文僅限學習分享,如產(chǎn)生版權問題,請聯(lián)系我們及時刪除。