搜集的面試plsql練習(xí)題一_第1頁
搜集的面試plsql練習(xí)題一_第2頁
搜集的面試plsql練習(xí)題一_第3頁
搜集的面試plsql練習(xí)題一_第4頁
搜集的面試plsql練習(xí)題一_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

enoNUMBER enoNUMBER --nameVARCHAR2(8) --');在Oracle中所有的過程都是以PL/SQL塊開始的,掌握PL/SQL對于過程的開發(fā)是非常用用處的PL/SQL塊的定義格式一些變程序的開程序中有可能出現(xiàn)異END/范例:使用以上的語句,創(chuàng)建一個(gè)簡單的程序 NUMBER;i:=30 --將變量i的內(nèi)容設(shè)置成DBMS_OUTPUT.PUT_LINE('i的內(nèi)容是:||iEND;/以上一個(gè)基本的語句塊已經(jīng)寫完了,但是里面并沒有任何的輸出,之所以這樣,主要原因在于SQLPLUSW中的系統(tǒng)輸出沒有打開,需要通過以令完成SETSETSERVEROUTPUTON以上是一個(gè)簡單的語句塊,但是在PLSQL塊中也可以直接進(jìn)行數(shù)據(jù)庫的查詢操作?!と绻胼斎牍蛦T編號的話,第八章存在一個(gè)替代enoNUMBER --nameVARCHAR2(8) --保存查詢出來的雇員DBMS_OUTPUT.PUT_LINE('請輸入雇員編號:eno:=&empnonumber;SELECTenameINTOnameFROMempWHEREempno=eno;DBMS_OUTPUT.PUT_LINE('編號為'||eno||'的雇員 是:'||name);END;/錯(cuò)誤之后依然可以正確的使用,則可以加入異常處理的操作機(jī)制。eno:=&empnonumbereno:=&empnonumberSELECTenameINTOnameFROMempWHEREempno=eno;DBMS_OUTPUT.PUT_LINE('編號為'||eno||'的雇員 是:'||name); --當(dāng)程序出現(xiàn)錯(cuò)誤的時(shí)候執(zhí)行此語句語句WHENNO_DATA_FOUNDDBMS_OUTPUT.PUT_LINE('沒有這個(gè)員工?。?!END;/但是,從以上的程序中可以發(fā)現(xiàn),在SQLPLUSW中輸出實(shí)際上并沒有真正的意義,所以顯示的格式也就沒有必要做任何的調(diào)整。PL/SQL塊中也可以編寫循環(huán)、判斷等語句。可以使用循環(huán)操作:LOOP,循 NUMBER;i1 --給變量i一個(gè)初始DBMS_OUTPUT.PUT_LINE('i='||i);EXITWHENi>=10;i:=i+1;ENDLOOP;END;/這個(gè)時(shí)候一個(gè)循環(huán)語句就已經(jīng)編寫完成了。此循環(huán)屬于先執(zhí)行后判斷,所以可以使用另外一種循環(huán)語句:WHILELOOP NUMBER;i1 --給變量i一個(gè)初始WHILE(i<=10)LOOPDBMS_OUTPUT.PUT_LINE('i='||i);i:=i+1;ENDLOOP;END;/PL/SQL中也可以使用FOR循環(huán)方式 NUMBER;FORiIN1..10LOOPDBMS_OUTPUT.PUT_LINE('i='||i);ENDLOOP;END/PLSQL NUMBER;FORiIN1..10LOOPDBMS_OUTPUT.PUT_LINE('i='||i);ENDLOOP;END/范例:給定一個(gè)值,要求判斷其是否大于10,如果大于,則顯示記錄大于10counNUMBER;coun:=11IFcoun>10THENDBMS_OUTPUT.PUT_LINE('記錄大于10條ENDIF;END/但是,以上的內(nèi)容都屬于固定好的結(jié)果,現(xiàn)在要求可以將emp表中的記錄數(shù)進(jìn)行驗(yàn)counNUMBER;SELECTCOUNT(empno)INTOcounFROMemp;IFcoun>10THENDBMS_OUTPUT.PUT_LINE('記錄大于10條ENDIF;END;/也可以使用ifelse語counNUMBER;SELECTCOUNT(empno)INTOcounFROMemp;coun:=3;IFcoun>10THENDBMS_OUTPUT.PUT_LINE('記錄大于10條DBMS_OUTPUT.PUT_LINE('記錄不大于10條ENDIF;END/If語句上還能繼續(xù)擴(kuò)展,ifelseifelse但是需要注意的是,在Oracle中的elseif要換成counNUMBER;SELECTCOUNT(empno)INTOcounFROMemp;coun:=3;IFcoun>10THENDBMS_OUTPUT.PUT_LINE('記錄大于10條ELSIFcoun<10THENDBMS_OUTPUT.PUT_LINE('記錄小于10條DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT.PUT_LINE('10條ENDIF;END/那么,下面就可以利用以上的語句完成一些的復(fù)雜功能要求:要求輸入一個(gè)雇員編號,為此雇員增長工資,增長工作按照以下的原則進(jìn)行10部門人員工資上漲20部門人員工資上漲30部門人員工資上漲但是所有的工資最高不超過5000enoNUMBER;dnoNUMBER;esalNUMBERDBMS_OUTPUT.PUT_LINE('請輸入雇員的編號:eno:=&empnumber;SELECTdeptno,salINTOdno,esalFROMempWHEREempno=eno;IFdno=10THENIFesal*1.1>5000UPDATEempSETsal=5000WHEREempno=eno;UPDATEempSETsal=sal*1.1WHEREempno=eno;ENDIF;ELSIFdno=20THENIFesal*1.2>5000THENUPDATEempSETsal=5000WHEREempno=eno;UPDATEempSETsal=sal*1.2WHEREempno=eno;ENDIF;ELSIFdno=30THENIFesal*1.3>5000THENUPDATEempSETsal=5000WHEREempno=eno;UPDATEempSETsal=sal*1.3WHEREempno=eno;ENDIF;null;--如果都不滿足,則什么也不操ENDIF;END;/、游游標(biāo):是內(nèi)存中用于裝載記錄的一個(gè)區(qū)如果要想使用游標(biāo),需要按照以下的步驟進(jìn)行處理1 游2 打開游3 取得游標(biāo)進(jìn)行PL/SQL的使用,將內(nèi)容放到變量之 erowemp%ROWTYPE --此變量可以裝下一行的emp記enoemp.empno%TYPE--使用emp表中的empno字段的類型定義eno變eno:=7369;SELECT*INTOerowFROMempWHEREempno=eno; :'||erow.ename); :'||erow.sal);END/對于各個(gè)基本類型:NUMBER、VARCHAR2都可以erowemp%ROWTYPE --此變量可以裝下一行的emp記enoemp.empno%TYPE--使用emp表中的empno字段的類型定義eno變eno:=7369;SELECT*INTOerowFROMempWHEREempno=eno; :'||erow.ename); :'||erow.sal);END/可以發(fā)現(xiàn)ROWTYPE確實(shí)可以裝下一條完整的記錄,之后使用ROWTYPE定義的變量,通過列名稱進(jìn)行。掌握了ROWTYPE之后,下面就可以使用游標(biāo)進(jìn)行操作了,游標(biāo)需要依次取出每一行的記錄。范例:使用游標(biāo)依次輸出雇員表中的編號和雇erowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycurISSELECT*FROMemp;-- 一個(gè)游標(biāo),游標(biāo)的名稱是mycurOPENmycur;--打開游FETCHmycurINTOerow;--移動(dòng)游標(biāo),并將移動(dòng)后的內(nèi)容放到erow之中WHILE(mycur%FOUND)LOOP--如果游標(biāo)的內(nèi)容存在DBMS_OUTPUT.PUT_LINE(erow.empno||'-->'||erow.ename);FETCHmycurINTOerow --ENDLOOPCLOSEmycur;--關(guān)閉游END/以上可以發(fā)現(xiàn),在循環(huán)之前需要先將游標(biāo)的指針向下移動(dòng),同時(shí)把內(nèi)容給erow之后繼續(xù)向下移動(dòng)游標(biāo),直到?jīng)]有任何內(nèi)容為止。也可以使用LOOP循環(huán)的方式操作游標(biāo)erowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycurISSELECT*FROMemp;-- 一個(gè)游標(biāo),游標(biāo)的名稱是mycurOPENmycur;--打開游FETCHFETCHmycurINTOerow;--移動(dòng)游標(biāo),并將移動(dòng)后的內(nèi)容放到erow之中EXITWHENmycur%NOTFOUND; --輸出之后還需要繼續(xù)移動(dòng)游標(biāo)DBMS_OUTPUT.PUT_LINE(erow.empno||'-->'||erow.ename);ENDLOOPCLOSEmycur;--END/erowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycurISSELECT*FROMemp;-- 一個(gè)游標(biāo),游標(biāo)的名稱是mycurFORerowINmycurLOOP--自動(dòng)打開、關(guān)閉、移動(dòng)游標(biāo)DBMS_OUTPUT.PUT_LINE(erow.empno||||erow.ename)ENDLOOP;END/此時(shí),結(jié)果同樣出來了,但是使用以上的循環(huán)操作最麻煩的地方在于需要手工打開游標(biāo)并且手工關(guān)erowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycurISSELECT*FROMemp;-- 一個(gè)游標(biāo),游標(biāo)的名稱是mycurFORerowINmycurLOOP--自動(dòng)打開、關(guān)閉、移動(dòng)游標(biāo)DBMS_OUTPUT.PUT_LINE(erow.empno||||erow.ename)ENDLOOP;END/上漲所有雇員的工資,增長工資按照以下的原則進(jìn)行10部門人員工資上漲20部門人員工資上漲30部門人員工資上漲erowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycurISSELECT*FROMemp;-- 一個(gè)游標(biāo),游標(biāo)的名稱是mycurFORerowINmycurLOOP--自動(dòng)打開、關(guān)閉、移動(dòng)游IFerow.deptno=10THENIFerow.sal*1.1>5000THENUPDATEempSETsal=5000WHEREempno=erow.empno;UPDATEempSETsal=sal*1.1WHEREempno=erow.empno;ENDIF;ELSIFerow.deptno=20THENIFerow.sal>5000THENUPDATEempSETsal=5000WHEREempno=erow.empno;UPDATEempSETsal=sal*1.2WHEREempno=erow.empno;ENDIF;ELSIFerow.deptno=30THENIFerow.sal>5000THENUPDATEempSETsal=5000WHEREempno=erow.empnoUPDATEempSETsal=sal*1.3WHEREempno=erow.empno;ENDIF;null;--ENDIF;ENDLOOP;END;/對于此種復(fù)雜的方式只能通過游標(biāo)進(jìn)行依次的操作游標(biāo)可以增加參數(shù),這種游標(biāo)稱為參數(shù)游標(biāo),例如:要求輸入一個(gè)部門編號,查詢出部門的雇員信息erowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycur(dnoemp.deptno%TYPE)ISSELECT*FROMempWHEREdeptno=dno -游標(biāo),游標(biāo)的名稱是mycurFORerowINmycur(&deptnumber --自動(dòng)打開、關(guān)閉、移動(dòng)游DBMS_OUTPUT.PUT_LINE(erow.empno||'-->'||erow.ename);ENDLOOP;END/一之前可以發(fā)現(xiàn)在游標(biāo)中可以使用%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPENerowemp%ROWTYPE --此變量可以裝下一行的emp記CURSORmycurISSELECT*FROMemp;-- 一個(gè)游標(biāo),游標(biāo)的名稱是mycurFORerowINmycurLOOP--自動(dòng)打開、關(guān)閉、移動(dòng)游標(biāo)DBMS_OUTPUT.PUT_LINE(mycur%ROWCOUNT||、||erow.empno||||erow.ename)ENDLOOP;END/可以發(fā)現(xiàn)ROWCOUNT與ROWNUM功能是一樣的,可以通過此功能求出行號、過CREATEOR CEPROCEDUREnull;END/過程=過程的CREATEOR CEPROCEDUREnull;END/范例:定義一個(gè)完整的過程,可以接收參數(shù),并且根據(jù)雇員的編號找出其工CREATEORRE CECREATEORRE CEPROCEDUREmyproc(enoemp.empno%TYPE)esalemp.sal%TYPE;SELECTsalINTOesalFROMempWHEREempno=enoDBMS_OUTPUT.PUT_LINE('工資是:'||esal);END/此時(shí),過程已經(jīng)成功的創(chuàng)建了過程是需要調(diào)用的,使用exec過程(參數(shù))的形式調(diào)用。exec此時(shí),一個(gè)過程已經(jīng)正常的執(zhí)行完畢范例:定義一個(gè)過程,通過此過程可以自動(dòng)加入部門信CREATEORRE CECREATEORRE CEPROCEDUREmyproc(dnodept.deptno%TYPE,namedept.dname%TYPE,loINSERTINTOdept(deptno,dname,loc)VALUES(dno,name,lo);END;/execmyproc(50,'技術(shù)部',')范例:但是進(jìn)一步思考的話,會發(fā)現(xiàn),部門的編號不應(yīng)該存在重復(fù),如果重復(fù)的話不應(yīng)該執(zhí)行插CREATECREATEORRECEPROCEDUREmyproc(dnodept.deptno%TYPE,namedept.dname%TYPE,locounNUMBER;SELECTCOUNT(deptno)INTOcounFROMdeptWHEREdeptno=dno;IFcoun>0THEN');INSERTINTOdept(deptno,dname,loc)VALUES(dno,name,lo);ENDIF;END/execmyproc(50,'技術(shù)部 ')實(shí)際上對于過程的參數(shù)也有三種類型·IN(傳遞一個(gè)數(shù)值,默認(rèn)的·INOUT(帶值進(jìn),并且修改后的

溫馨提示

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

評論

0/150

提交評論