版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
實用數(shù)據(jù)庫技術(shù)
Oracle10g數(shù)據(jù)庫管理系統(tǒng)實用數(shù)據(jù)庫技術(shù)Oracle10g數(shù)據(jù)庫管理系統(tǒng)學(xué)習(xí)內(nèi)容Oracle概述Oracle10g數(shù)據(jù)庫安裝Oracle10g數(shù)據(jù)庫卸載Oracle10g常用管理工具Oracle10g表管理使用過程和觸發(fā)器學(xué)習(xí)內(nèi)容Oracle概述Oracle概述Oracle公司Oracle數(shù)據(jù)庫Oracle概述Oracle公司Oracle10g數(shù)據(jù)庫安裝服務(wù)器安裝需求版本企業(yè)版標(biāo)準(zhǔn)版?zhèn)€人版最低配置
CPU:Pentium166
內(nèi)存:128MB
硬盤空間:企業(yè)版(1.76GB):標(biāo)準(zhǔn)版(1.76GB):個人版(1.72GB)
視頻:256色Oracle10g數(shù)據(jù)庫安裝服務(wù)器安裝需求Oracle10g數(shù)據(jù)庫安裝客戶端安裝需求安裝類型管理者(administrator)運行時環(huán)境(runtime)自定義(custom)最低配置
CPU:Pentium166
內(nèi)存:128MB
硬盤空間:管理者(647MB):運行時環(huán)境(486MB)
Oracle10g數(shù)據(jù)庫安裝客戶端安裝需求Oracle10g數(shù)據(jù)庫安裝過程(略)Oracle10g數(shù)據(jù)庫安裝過程(略)Oracle數(shù)據(jù)庫卸載1、停止服務(wù)2、卸載Oracle產(chǎn)品3、清理注冊表4、清理環(huán)境變量5、清理磁盤Oracle數(shù)據(jù)庫卸載1、停止服務(wù)Oracle卸載1/5開始->設(shè)置->控制面板->管理工具->服務(wù)停止所有Oracle服務(wù)Oracle卸載1/5開始->設(shè)置->控制面板->管理工具Oracle卸載2/5開始->程序->OracleInstallationProducts->UniversalInstaller卸裝所有Oracle產(chǎn)品,但UniversalInstaller本身不能被刪除Oracle卸載2/5開始->程序->OracleInsOracle卸載3/5運行regeditHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services滾動這個列表,刪除所有Oracle入口。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,除所有Oracle入口。Oracle卸載3/5運行regeditOracle卸載4/5開始->設(shè)置->控制面板->系統(tǒng)->高級->環(huán)境變量刪除環(huán)境變量CLASSPATH和PATH中有關(guān)Oracle的設(shè)定Oracle卸載4/5開始->設(shè)置->控制面板->系統(tǒng)->Oracle卸載5/5從桌面上、STARTUP(啟動)組、程序菜單中,刪除所有有關(guān)Oracle的組和圖標(biāo)刪除\ProgramFiles\Oracle目錄重新啟動計算機(jī),重起后才能完全刪除Oracle所在目錄,刪除與Oracle有關(guān)的文件,選擇Oracle所在的缺省目錄C:\Oracle,刪除這個入
口目錄及所有子目錄,并從Windows2000目錄(一般為C:\WINNT)下刪除以下文件ORACLE.INI、oraodbc.ini等等。Oracle卸載5/5從桌面上、STARTUP(啟動)組、Oracle10g常用管理工具OEM控制臺SQL*PLUS工具介紹Oracle10g常用管理工具OEM控制臺Oracle10g表管理在Oracle中建表,主要有兩種方式:一種是在SQL*PLUS中執(zhí)行建表的SQL語句。另一種是通過OEM工具。Oracle10g表管理在Oracle中建表,主要有兩種方式Oracle10g數(shù)據(jù)中的數(shù)據(jù)類型數(shù)據(jù)類型類型說明CHAR字符型,最長為2000BNCHAR基于字符集的字符型,同上VARCHAR2變長字符型,最長為4000BNVARCHAR2基于字符集的變長字符型,同上VARCHAR同VARCHAR2LONG變長字符型,最長為2GBNUMBER(s,d)數(shù)字型,總位數(shù)為s位,小數(shù)位為d位,總長最大為38位DATE日期型RAW純二進(jìn)制數(shù)據(jù)類型,最長為2000BLONGRAW變長二進(jìn)制數(shù)據(jù)類型,最長為2GBBLOB二進(jìn)制大對象類型,最長為4GBNLOB包含定寬的多位數(shù)字符的字符大對象類型,最長為4GBCLOB包含單個字符的字符大對象類型,最長為4GBBFILE數(shù)據(jù)庫外的大型二進(jìn)制文件的輸入指示器類型,最大為4GBOracle10g數(shù)據(jù)中的數(shù)據(jù)類型數(shù)據(jù)類型類型說明CHARPL/SQL語言基礎(chǔ)注釋變量聲明運算符PL/SQL塊結(jié)構(gòu)控制語句PL/SQL語言基礎(chǔ)注釋PL/SQL程序設(shè)計簡介PL/SQL是一種高級數(shù)據(jù)庫程序設(shè)計語言,該語言專門用于在各種環(huán)境下對ORACLE數(shù)據(jù)庫進(jìn)行訪問。由于該語言集成于數(shù)據(jù)庫服務(wù)器中,所以PL/SQL代碼可以對數(shù)據(jù)進(jìn)行快速高效的處理。除此之外,可以在ORACLE數(shù)據(jù)庫的某些客戶端工具中,使用PL/SQL語言也是該語言的一個特點。PL/SQL程序設(shè)計簡介PL/SQL是一種高級數(shù)據(jù)庫程序SQL與PL/SQLPL/SQL是ProcedureLanguage&StructuredQueryLanguage的縮寫。ORACLE的SQL是支持ANSI(AmericannationalStandardsInstitute)和ISO92(InternationalStandardsOrganization)標(biāo)準(zhǔn)的產(chǎn)品。PL/SQL是對SQL語言存儲過程語言的擴(kuò)展。SQL與PL/SQLPL/SQL是ProcedureLa為什么使用PL/SQL有利于客戶/服務(wù)器環(huán)境應(yīng)用的運行適合于客戶環(huán)境為什么使用PL/SQL有利于客戶/服務(wù)器環(huán)境應(yīng)用的運行PL/SQL塊結(jié)構(gòu)PL/SQL程序由三個塊組成,即聲明部分、執(zhí)行部分、異常處理部分。DECLARE/*聲明部分:在此聲明PL/SQL用到的變量,類型及游標(biāo),以及局部的存儲過程和函數(shù)*/BEGIN/*執(zhí)行部分:過程及SQL語句,即程序的主要部分*/EXCEPTION/*執(zhí)行異常部分:錯誤處理*/END;PL/SQL塊結(jié)構(gòu)PL/SQL程序由三個塊組成,即聲明部分、PL/SQL塊可以分為三類
無名塊:動態(tài)構(gòu)造,只能執(zhí)行一次。子程序:存儲在數(shù)據(jù)庫中的存儲過程、函數(shù)及包等。當(dāng)在數(shù)據(jù)庫上建立好后可以在其它程序中調(diào)用它們。觸發(fā)器:當(dāng)數(shù)據(jù)庫發(fā)生操作時,會觸發(fā)一些事件,從而自動執(zhí)行相應(yīng)的程序。PL/SQL塊可以分為三類無名塊:動態(tài)構(gòu)造,只能執(zhí)行一次。標(biāo)識符PL/SQL程序設(shè)計中的標(biāo)識符定義與SQL的標(biāo)識符定義的要求相同。要求和限制有:標(biāo)識符名不能超過30字符;第一個字符必須為字母;不分大小寫;不能用’-‘(減號);不能是SQL保留字。標(biāo)識符PL/SQL程序設(shè)計中的標(biāo)識符定義與SQL的標(biāo)識符定實例下面的例子將會刪除所有的紀(jì)錄,而不是KING的記錄。DECLAREv_enamevarchar2(20):='KING';BEGINDELETEFROMempWHEREename=v_ename;END;實例下面的例子將會刪除所有的紀(jì)錄,而不是KING的記錄。D如何運行PL/SQL塊結(jié)構(gòu)?如何運行PL/SQL塊結(jié)構(gòu)?如何運行PL/SQL塊結(jié)構(gòu)?如何運行PL/SQL塊結(jié)構(gòu)?建議的命名方法建議的命名方法PL/SQL變量類型實例插入一條記錄并顯示DECLARERow_idROWID;infoVARCHAR2(40);BEGIN INSERTINTOdeptVALUES(90,'SERVICE','BEIJING') RETURNINGrowid,dname||':'||to_char(deptno)||':'||loc INTOrow_id,info; DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id); DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL變量類型實例插入一條記錄并顯示DECLAREPL/SQL變量類型實例其中,RETURNING子句用于檢索INSERT語句中所影響的數(shù)據(jù)行數(shù),當(dāng)INSERT語句使用VALUES子句插入數(shù)據(jù)時,RETURNING子句還可將列表達(dá)式、ROWID和REF值返回到輸出變量中。在使用RETURNING子句是應(yīng)注意以下幾點限制:不能并行DML語句;不能檢索LONG類型信息;當(dāng)通過視圖向基表中插入數(shù)據(jù)時,只能與單基表視圖一起使用。PL/SQL變量類型實例其中,RETURNING子句用于檢PL/SQL變量類型實例修改一條記錄并顯示DECLARERow_idROWID;infoVARCHAR2(40);BEGIN UPDATEdeptSETdeptno=80WHEREDNAME='SERVICE' RETURNINGrowid,dname||':'||to_char(deptno)||':'||loc INTOrow_id,info; DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id); DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL變量類型實例修改一條記錄并顯示DECLAREPL/SQL變量類型實例其中,RETURNING子句用于檢索被修改行信息,當(dāng)UPDATE語句修改單行數(shù)據(jù)時,RETURNING子句可以檢索被修改行的ROWID值,以及行中被修改列的列表達(dá)式,并可將他們存儲到PL/SQL變量或復(fù)合變量中;當(dāng)UPDATE語句修改多行數(shù)據(jù)時,RETURNING子句可以將被修改行的ROWID值,以及列表達(dá)式值返回到復(fù)合變量數(shù)組中。在UPDATE中使用RETURNING子句的限制與INSERT語句中對RETURNING子句的限制相同。PL/SQL變量類型實例其中,RETURNING子句用于檢PL/SQL變量類型實例刪除一條記錄并顯示DECLARERow_idROWID;infoVARCHAR2(40);BEGIN DELETEdeptWHEREDNAME='SERVICE' RETURNINGrowid,dname||':'||to_char(deptno)||':'||loc INTOrow_id,info; DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id); DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL變量類型實例刪除一條記錄并顯示DECLAREPL/SQL變量類型實例RETURNING子句用于檢索被刪除行信息,當(dāng)DELETE語句修改單行數(shù)據(jù)時,RETURNING子句可以檢索被刪除行的ROWID,以及被刪除行中列的列表達(dá)式,并可將他們存儲到PL/SQL變量或復(fù)合變量中;當(dāng)UPDATE語句修改多行數(shù)據(jù)時,RETURNING子句可以將被修改行的ROWID,以及列表達(dá)式值返回到復(fù)合變量數(shù)組中。在UPDATE中使用RETURNING子句的限制與INSERT語句中對RETURNING子句的限制相同。PL/SQL變量類型實例RETURNING子句用于檢索被刪復(fù)合類型ORACLE在PL/SQL中除了提供象前面介紹的各種類型外,還提供一種稱為復(fù)合類型的類型---記錄和表。記錄類型使用%TYPE使用%ROWTYPE復(fù)合類型ORACLE在PL/SQL中除了提供象前面介紹記錄類型記錄類型是把邏輯相關(guān)的數(shù)據(jù)作為一個單元存儲起來,它必須包括至少一個標(biāo)量型(數(shù)字型、字符型、布爾型、日期型)或RECORD數(shù)據(jù)類型的成員,稱作PL/SQLRECORD的域(FIELD),其作用是存放互不相同但邏輯相關(guān)的信息。記錄類型記錄類型是把邏輯相關(guān)的數(shù)據(jù)作為一個單元存儲起來,它必定義記錄類型語法如下:TYPErecord_typeISRECORD(Field1type1[NOTNULL][:=exp1],Field2type2[NOTNULL][:=exp2],......Fieldntypen[NOTNULL][:=expn]);定義記錄類型語法如下:TYPErecord_typeIS實例DECLARETYPEtest_recISRECORD(CodeVARCHAR2(10),NameVARCHAR2(30)NOTNULL:='abook');V_booktest_rec;BEGINV_book.code:='123';V_:='C++Programming';DBMS_OUTPUT.PUT_LINE(v_book.code||v_);END;實例DECLARE使用%TYPE定義一個變量,其數(shù)據(jù)類型與已經(jīng)定義的某個數(shù)據(jù)變量的類型相同,或者與數(shù)據(jù)庫表的某個列的數(shù)據(jù)類型相同,這時可以使用%TYPE。使用%TYPE特性的優(yōu)點在于:所引用的數(shù)據(jù)庫列的數(shù)據(jù)類型可以不必知道;所引用的數(shù)據(jù)庫列的數(shù)據(jù)類型可以實時改變。使用%TYPE定義一個變量,其數(shù)據(jù)類型與已經(jīng)定義的某個數(shù)據(jù)變實例1DECLARE--用%TYPE類型定義與表相配的字段TYPEt_RecordISRECORD(T_noemp.empno%TYPE,T_nameemp.ename%TYPE,T_salemp.sal%TYPE);--聲明接收數(shù)據(jù)的變量v_empt_Record;BEGINSELECTempno,ename,salINTOv_empFROMempWHEREempno=7788;DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)||v_emp.t_name||TO_CHAR(v_emp.t_sal));END;實例1DECLARE實例2DECLAREv_empnoemp.empno%TYPE:=&no;Typer_recordisrecord(v_nameemp.ename%TYPE,v_salemp.sal%TYPE,v_dateemp.hiredate%TYPE);Recr_record;BEGINSELECTename,sal,hiredateINTORecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE(Rec.v_name||'---'||Rec.v_sal||'--'||Rec.v_date);END;實例2DECLARE使用%ROWTYPEPL/SQL提供%ROWTYPE操作符,返回一個記錄類型,其數(shù)據(jù)類型和數(shù)據(jù)庫表的數(shù)據(jù)結(jié)構(gòu)相一致。使用%ROWTYPE特性的優(yōu)點在于:所引用的數(shù)據(jù)庫中列的個數(shù)和數(shù)據(jù)類型可以不必知道;所引用的數(shù)據(jù)庫中列的個數(shù)和數(shù)據(jù)類型可以實時改變。使用%ROWTYPEPL/SQL提供%ROWTYPE操作符實例DECLAREv_empnoemp.empno%TYPE:=&no;recemp%ROWTYPE;BEGINSELECT*INTOrecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工資:'||rec.sal||'工作時間:'||rec.hiredate);END;實例DECLARE運算符和表達(dá)式算術(shù)運算符運算符和表達(dá)式算術(shù)運算符運算符和表達(dá)式關(guān)系運算符運算符和表達(dá)式關(guān)系運算符運算符和表達(dá)式邏輯運算符運算符和表達(dá)式邏輯運算符變量賦值在PL/SQL編程中,變量賦值是一個值得注意的地方,它的語法如下:
variable是一個PL/SQL變量,expression是一個PL/SQL表達(dá)式。variable:=expression;變量賦值在PL/SQL編程中,變量賦值是一個值得注意的地方,字符及數(shù)字運算特點空值加數(shù)字仍是空值:NULL+<數(shù)字>=NULL空值加(連接)字符,結(jié)果為字符:NULL||<字符串>=<字符串>字符及數(shù)字運算特點空值加數(shù)字仍是空值:NULL+<數(shù)BOOLEAN賦值布爾值只有TRUE,FALSE及NULL三個值。如:DECLAREdoneBOOLEAN;/*thefollowingstatementsarelegal:*/BEGINdone:=FALSE;WHILENOTdoneLOOPNull;ENDLOOP;END;BOOLEAN賦值布爾值只有TRUE,FALSE及N游標(biāo)賦值游標(biāo)賦值是通過SELECT語句來完成的,每次執(zhí)行SELECT語句就賦值一次,一般要求被賦值的變量與SELECT中的列名要一一對應(yīng)。游標(biāo)賦值游標(biāo)賦值是通過SELECT語句來完成的,每次執(zhí)行游標(biāo)賦值DECLAREemp_idemp.empno%TYPE:=7788;emp_nameemp.ename%TYPE;wagesemp.sal%TYPE;BEGINSELECTename,NVL(sal,0)+NVL(comm,0)INTOemp_name,wagesFROMempWHEREempno=emp_id;DBMS_OUTPUT.PUT_LINE(emp_name||’----‘||to_char(wages));END;結(jié)果:SCOTT----3000游標(biāo)賦值DECLARE可轉(zhuǎn)換的類型賦值CHAR轉(zhuǎn)換為NUMBER:使用TO_NUMBER函數(shù)來完成字符到數(shù)字的轉(zhuǎn)換,如:v_total:=TO_NUMBER(‘100.0’)+sal;NUMBER轉(zhuǎn)換為CHAR:使用TO_CHAR函數(shù)可以實現(xiàn)數(shù)字到字符的轉(zhuǎn)換,如:v_comm:=TO_CHAR(‘123.45’)||’元’;字符轉(zhuǎn)換為日期:使用TO_DATE函數(shù)可以實現(xiàn)字符到日期的轉(zhuǎn)換,如:v_date:=TO_DATE('2001.07.03','yyyy.mm.dd');日期轉(zhuǎn)換為字符:使用TO_CHAR函數(shù)可以實現(xiàn)日期到字符的轉(zhuǎn)換,如:v_to_day:=TO_CHAR(SYSDATE,'yyyy.mm.ddhh24:mi:ss');可轉(zhuǎn)換的類型賦值CHAR轉(zhuǎn)換為NUMBER:變量作用范圍及可見性PL/SQL的變量作用范圍特點是:變量的作用范圍是在你所引用的程序單元(塊、子程序、包)內(nèi)。即從聲明變量開始到該塊的結(jié)束。一個變量(標(biāo)識)只能在你所引用的塊內(nèi)是可見的。當(dāng)一個變量超出了作用范圍,PL/SQL引擎就釋放用來存放該變量的空間(因為它可能不用了)。在子塊中重新定義該變量后,它的作用僅在該塊內(nèi)。變量作用范圍及可見性PL/SQL的變量作用范圍特點是:實例DECLAREEmesschar(80);BEGINDECLAREV1NUMBER(4);BEGINSELECTempnoINTOv1FROMempWHERELOWER(job)=’president’; DBMS_OUTPUT.PUT_LINE(V1);EXCEPTIONWhenTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(‘Morethanonepresident’);END;實例DECLARE實例續(xù)…DECLAREV1NUMBER(4);BEGINSELECTempnoINTOv1FROMempWHERELOWER(job)=’manager’;EXCEPTIONWhenTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(‘Morethanonemanager’);END;EXCEPTIONWhenothersTHENEmess:=substr(SQLERRM,1,80);DBMS_OUTPUT.PUT_LINE(emess);END;實例續(xù)…DECLARE注釋在PL/SQL里,可以使用兩種符號來寫注釋,即:使用雙‘-‘(減號)加注釋
V_SalNUMBER(12,2);--工資變量。使用/**/來加一行或多行注釋
/***********************************************//*文件名:department_salary.sql*//***********************************************/注釋在PL/SQL里,可以使用兩種符號來寫注釋,即:示例簡單數(shù)據(jù)插入例子
DECLAREv_enameVARCHAR2(20):=‘Bill’;v_salNUMBER(7,2):=1234.56;v_deptnoNUMBER(2):=10;v_empnoNUMBER(4):=8888;BEGININSERTINTOemp(empno,ename,JOB,sal,deptno,hiredate)VALUES(v_empno,v_ename,‘Manager’,v_sal,v_deptno,TO_DATE(’1954.06.09’,’yyyy.mm.dd’));COMMIT;END;示例簡單數(shù)據(jù)插入例子DECLARE示例簡單數(shù)據(jù)刪除例子
DECLAREv_empnonumber(4):=8888;BEGINDELETEFROMempWHEREempno=v_empno;COMMIT;END;示例簡單數(shù)據(jù)刪除例子DECLAREPL/SQL流程控制語句PL/SQL的流程控制語句包括如下三類:控制語句:IF語句;循環(huán)語句:LOOP語句,EXIT語句;順序語句:GOTO語句,NULL語句。PL/SQL流程控制語句PL/SQL的流程控制語句包括如下條件語句IF<布爾表達(dá)式>THENPL/SQL和SQL語句ENDIF;IF<布爾表達(dá)式>THENPL/SQL和SQL語句ELSE其它語句ENDIF;條件語句IF<布爾表達(dá)式>THENIF<布爾表達(dá)式>條件語句IF<布爾表達(dá)式>THENPL/SQL和SQL語句ELSIF<其它布爾表達(dá)式>THEN
其它語句ELSIF<其它布爾表達(dá)式>THEN
其它語句ELSE
其它語句ENDIF;條件語句IF<布爾表達(dá)式>THEN條件語句實例DECLAREv_empnoemp.empno%TYPE:=&empno;V_salaryemp.sal%TYPE;V_commentVARCHAR2(35);BEGINSELECTsalINTOv_salaryFROMempWHEREempno=v_empno;IFv_salary<1500THENV_comment:='Fairlyless';ELSIFv_salary<3000THENV_comment:='Alittlemore';ELSEV_comment:='Lotsofsalary';ENDIF;DBMS_OUTPUT.PUT_LINE(V_comment);END;條件語句實例DECLARECASE表達(dá)式CASEselector WHENexpression1THENresult1 WHENexpression2THENresult2 WHENexpressionNTHENresultN [ELSEresultN+1]END;CASE表達(dá)式CASEselectorCASE表達(dá)式實例DECLARE V_gradechar(1):=UPPER('&p_grade'); V_appraisalVARCHAR2(20);BEGIN V_appraisal:= CASEv_grade WHEN'A'THEN'Excellent' WHEN'B'THEN'VeryGood' WHEN'C'THEN'Good' ELSE'Nosuchgrade' END; DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'Appraisal:'||v_appraisal);END;CASE表達(dá)式實例DECLARECASE表達(dá)式實例代碼運行結(jié)果:Entervalueforp_grade:Aold2:V_gradechar(1):=UPPER('&p_grade');new2:V_gradechar(1):=UPPER('A');Grade:AAppraisal:ExcellentCASE表達(dá)式實例代碼運行結(jié)果:循環(huán)簡單循環(huán)
LOOP
要執(zhí)行的語句;EXITWHEN<條件語句>/*條件滿足,退出循環(huán)語句*/ENDLOOP;循環(huán)簡單循環(huán)LOOPLOOP循環(huán)實例DECLAREintNUMBER(2):=0;BEGINLOOPint:=int+1;DBMS_OUTPUT.PUT_LINE('int的當(dāng)前值為:'||int);EXITWHENint=10;ENDLOOP;END;LOOP循環(huán)實例DECLARE循環(huán)WHILE循環(huán)
WHILE<布爾表達(dá)式>LOOP要執(zhí)行的語句;ENDLOOP;循環(huán)WHILE循環(huán)WHILE<布爾表達(dá)式>LOOPWHILE循環(huán)實例DECLARExNUMBER:=1;BEGINWHILEx<=10LOOPDBMS_OUTPUT.PUT_LINE('X的當(dāng)前值為:'||x); x:=x+1;ENDLOOP;END;WHILE循環(huán)實例DECLARE循環(huán)數(shù)字式循環(huán)每循環(huán)一次,循環(huán)變量自動加1,使用關(guān)鍵字REVERSE,循環(huán)變量自動減1。跟在INREVERSE后面的數(shù)字必須是從小到大的順序,而且必須是整數(shù),不能是變量或表達(dá)式??梢允褂肊XIT退出循環(huán)。FOR循環(huán)計數(shù)器IN[REVERSE]下限..上限LOOP要執(zhí)行的語句;ENDLOOP;循環(huán)數(shù)字式循環(huán)FOR循環(huán)計數(shù)器IN[REVERSE數(shù)字式循環(huán)實例BEGINFORintin1..10LOOPDBMS_OUTPUT.PUT_LINE('int的當(dāng)前值為:'||int);ENDLOOP;END;數(shù)字式循環(huán)實例BEGIN數(shù)字式循環(huán)實例CREATETABLEtemp_table(num_colNUMBER);DECLAREV_counterNUMBER:=10;BEGININSERTINTOtemp_table(num_col)VALUES(v_counter);FORv_counterIN20..25LOOPINSERTINTOtemp_table(num_col)VALUES(v_counter);ENDLOOP;INSERTINTOtemp_table(num_col)VALUES(v_counter);FORv_counterINREVERSE20..25LOOPINSERTINTOtemp_table(num_col)VALUES(v_counter);ENDLOOP;END;DROPTABLEtemp_table;數(shù)字式循環(huán)實例CREATETABLEtemp_tablGOTO和標(biāo)簽<<label>>
標(biāo)號是用<<
>>括起來的標(biāo)識符GOTOlabel;GOTO和標(biāo)簽GOTOlabel;GOTO和標(biāo)簽實例DECLAREV_counterNUMBER:=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE('V_counter的當(dāng)前值為:'||V_counter);V_counter:=v_counter+1;IFv_counter>10THENGOTOl_ENDofLOOP;ENDIF;ENDLOOP;<<l_ENDofLOOP>>DBMS_OUTPUT.PUT_LINE('V_counter的當(dāng)前值為:'||V_counter);END;GOTO和標(biāo)簽實例DECLARENULL語句DECLARE...BEGIN…
IFv_numISNULLTHEN
GOTOprint1;
ENDIF;
…
<<print1>>
NULL;--不需要處理任何數(shù)據(jù)。END;NULL語句DECLARE游標(biāo)概念為了處理SQL語句獲取一個表中記錄,ORACLE提供一個上下文,它提供了一個指向語句的指針以及查詢的活動集(activeset)。游標(biāo)是一個指向上下文的句柄(handle)或指針。通過游標(biāo),PL/SQL可以控制上下文區(qū)和處理語句時上下文區(qū)會發(fā)生些什么事情。游標(biāo)概念為了處理SQL語句獲取一個表中記錄,ORACLE游標(biāo)概念對于不同的SQL語句,游標(biāo)的使用情況不同:游標(biāo)概念對于不同的SQL語句,游標(biāo)的使用情況不同:處理顯式游標(biāo)顯式游標(biāo)處理需四個PL/SQL步驟:定義游標(biāo) 格式:CURSORcursor_nameISselect_statement;打開游標(biāo)格式:OPENcursor_name;提取游標(biāo)數(shù)據(jù)格式:FETCHcursor_nameINTO{variable_list|record_variable};關(guān)閉游標(biāo)格式:CLOSEcursor_name;處理顯式游標(biāo)顯式游標(biāo)處理需四個PL/SQL步驟:示例1
DECLARECURSORc_cursorISSELECTename,salFROMempWHERErownum<11;v_enameemp.ename%TYPE;v_salemp.sal%TYPE;BEGINOPENc_cursor;FETCHc_cursorINTOv_ename,v_sal;WHILEc_cursor%FOUNDLOOPDBMS_OUTPUT.PUT_LINE(v_ename||'---'|to_char(v_sal));FETCHc_cursorINTOv_ename,v_sal;ENDLOOP;CLOSEc_cursor;END;示例1DECLARE示例2
DECLARE DeptRecdept%ROWTYPE; Dept_namedept.dname%TYPE; Dept_locdept.loc%TYPE; CURSORc1ISSELECTdname,locFROMdeptWHEREdeptno<=30; CURSORc2(dept_noNUMBERDEFAULT10)IS SELECTdname,locFROMdeptWHEREdeptno<=dept_no; CURSORc3(dept_noNUMBERDEFAULT10)IS SELECT*FROMdeptWHEREdeptno<=dept_no;BEGIN OPENc1; LOOP FETCHc1INTOdept_name,dept_loc; EXITWHENc1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(dept_name||'---'|dept_loc); ENDLOOP;示例2DECLARE示例2
續(xù)… CLOSEc1; OPENc2; LOOP FETCHc2INTOdept_name,dept_loc; EXITWHENc2%NOTFOUND; DBMS_OUTPUT.PUT_LINE(dept_name||'---'|dept_loc); ENDLOOP; CLOSEc2; OPENc3(dept_no=>20); LOOP FETCHc3INTOdeptrec; EXITWHENc3%NOTFOUND; DBMS_OUTPUT.PUT_LINE(deptrec.deptno||'---'|deptrec.dname||'---'|deptrec.loc); ENDLOOP; CLOSEc3;END;示例2續(xù)… CLOSEc1;游標(biāo)屬性%FOUND布爾型屬性,當(dāng)最近一次讀記錄時成功返回,則值為TRUE;
%NOTFOUND布爾型屬性,與%FOUND相反;
%ISOPEN布爾型屬性,當(dāng)游標(biāo)已打開時返回TRUE;
%ROWCOUNT數(shù)字型屬性,返回已從游標(biāo)中讀取的記錄數(shù)。游標(biāo)屬性%FOUND布爾型屬性,當(dāng)最近一次示例DECLAREv_empnoemp.empno%TYPE;v_salemp.sal%TYPE;CURSORc_cursorISSELECTempno,salFROMemp;BEGINOPENc_cursor;LOOPFETCHc_cursorINTOv_empno,v_sal;EXITWHENc_cursor%NOTFOUND;IFv_sal<=1200THENUPDATEempSETsal=sal+50WHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'工資已更新!');ENDIF;DBMS_OUTPUT.PUT_LINE('記錄數(shù):'||c_cursor%ROWCOUNT);ENDLOOP;CLOSEc_cursor;END;示例DECLARE游標(biāo)的FOR循環(huán)
FORindex_variableINcursor_name[value[,value]…]LOOP --游標(biāo)數(shù)據(jù)處理代碼
ENDLOOP;游標(biāo)的FOR循環(huán) FORindex_variableI游標(biāo)中使用FOR循環(huán)示例DECLARECURSORc_salISSELECTempno,ename,salFROMemp;BEGIN--隱含打開游標(biāo)
FORv_salINc_salLOOP--隱含執(zhí)行一個FETCH語句
DBMS_OUTPUT.PUT_LINE(to_char(v_sal.empno)||'---'||v_sal.ename||'---'||to_char(v_sal.sal));--隱含監(jiān)測c_sal%NOTFOUNDENDLOOP;--隱含關(guān)閉游標(biāo)END;游標(biāo)中使用FOR循環(huán)示例DECLARE有參數(shù)游標(biāo)中使用FOR循環(huán)示例DECLARE CURSORc_cursor(dept_noNUMBERDEFAULT10)IS SELECTdname,locFROMdeptWHEREdeptno<=dept_no;BEGIN DBMS_OUTPUT.PUT_LINE('dept_no參數(shù)值為30:'); FORc1_recINc_cursor(30)LOOP--c_cursor(dept_n=>30) DBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc); ENDLOOP; DBMS_OUTPUT.PUT_LINE(CHR(10)||'使用默認(rèn)的dept_no參數(shù)值10:'); FORc1_recINc_cursorLOOP DBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc); ENDLOOP;END;有參數(shù)游標(biāo)中使用FOR循環(huán)示例DECLARE游標(biāo)FOR循環(huán)語句中使用子查詢來實現(xiàn)游標(biāo)實例BEGIN FORc1_recIN(SELECTdname,locFROMdept)LOOP DBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc); ENDLOOP;END;游標(biāo)FOR循環(huán)語句中使用子查詢來實現(xiàn)游標(biāo)實例BEGIN處理隱式游標(biāo)當(dāng)查詢返回結(jié)果超過一行時,就需要一個顯式游標(biāo)。顯式游標(biāo)主要是用于對查詢語句的處理,尤其是在查詢結(jié)果為多條記錄的情況下;而對于非查詢語句,如修改、刪除操作,則由ORACLE系統(tǒng)自動地為這些操作設(shè)置游標(biāo)并創(chuàng)建其工作區(qū),這些由系統(tǒng)隱含創(chuàng)建的游標(biāo)稱為隱式游標(biāo),隱式游標(biāo)的名字為SQL,這是由ORACLE系統(tǒng)定義的。對于隱式游標(biāo)的操作,如定義、打開、取值及關(guān)閉操作,都由ORACLE系統(tǒng)自動地完成,無需用戶進(jìn)行處理。用戶只能通過隱式游標(biāo)的相關(guān)屬性,來完成相應(yīng)的操作。在隱式游標(biāo)的工作區(qū)中,所存放的數(shù)據(jù)是與用戶自定義的顯示游標(biāo)無關(guān)的、最新處理的一條SQL語句所包含的數(shù)據(jù)。處理隱式游標(biāo)當(dāng)查詢返回結(jié)果超過一行時,就需要一個顯式游標(biāo)。顯處理隱式游標(biāo)
格式調(diào)用為:SQL%當(dāng)執(zhí)行一條DML語句后,DML語句的結(jié)果保存在四個游標(biāo)屬性中,這些屬性用于控制程序流程或者了解程序的狀態(tài)。當(dāng)運行DML語句時,PL/SQL打開一個內(nèi)建游標(biāo)并處理結(jié)果,游標(biāo)是維護(hù)查詢結(jié)果的內(nèi)存中的一個區(qū)域,游標(biāo)在運行DML語句時打開,完成后關(guān)閉。處理隱式游標(biāo) 格式調(diào)用為:SQL%處理隱式游標(biāo)隱式游標(biāo)只使用SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT三個屬性,SQL%FOUND,SQL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數(shù)值。處理隱式游標(biāo)隱式游標(biāo)只使用SQL%FOUND、SQL%NOT處理隱式游標(biāo) SQL%FOUND,布爾型屬性,當(dāng)最近一次讀記錄時成功返回,則值為TRUE。在執(zhí)行任何DML語句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在執(zhí)行DML語句后,SQL%FOUND的屬性值將是:INSERT為TRUE;DELETE和UPDATE,至少有一行被DELETE或UPDATE為TRUE;SELECTINTO至少返回一行為TRUE;SQL%FOUND為TRUE時,SQL%NOTFOUND為FALSE。處理隱式游標(biāo) SQL%FOUND,布爾型屬性,當(dāng)最近一次讀記處理隱式游標(biāo)示例DECLAREV_deptnoemp.deptno%TYPE:=&p_deptno;BEGIN DELETEFROMempWHEREdeptno=v_deptno; IFSQL%NOTFOUNDTHEN DELETEFROMdeptWHEREdeptno=v_deptno; ENDIF;END;處理隱式游標(biāo)示例DECLARE異常錯誤處理異常情況處理是用來處理正常執(zhí)行過程中未預(yù)料的事件,程序塊的異常處理預(yù)定義的錯誤和自定義錯誤,由于PL/SQL程序塊一旦產(chǎn)生異常而沒有指出如何處理時,程序就會自動終止整個程序運行。異常錯誤處理異常情況處理是用來處理正常執(zhí)行過程中未預(yù)料的事件有三種類型的異常:預(yù)定義(Predefined)異常ORACLE預(yù)定義的異常情況大約有24個。對這種異常情況的處理,無需在程序中定義,由ORACLE自動將其引發(fā)。非預(yù)定義(Predefined)異常即其他標(biāo)準(zhǔn)的ORACLE錯誤。對這種異常情況的處理,需要用戶在程序中定義,然后由ORACLE自動將其引發(fā)。用戶定義(User_define)異常程序執(zhí)行過程中,出現(xiàn)編程人員認(rèn)為的非正常情況。對這種異常情況的處理,需要用戶在程序中定義,然后顯式地在程序中將其引發(fā)。有三種類型的異常:預(yù)定義(Predefined)異常異常處理部分結(jié)構(gòu)EXCEPTIONWHENfirst_exceptionTHEN<codetohandlefirstexception>WHENsecond_exceptionTHEN<codetohandlesecondexception>WHENOTHERSTHEN<codetohandleothersexception>END;異常處理部分結(jié)構(gòu)EXCEPTION預(yù)定義的異常處理預(yù)定義的異常處理實例DECLAREv_empnoemp.empno%TYPE:=&empno;v_salemp.sal%TYPE;BEGINSELECTsalINTOv_salFROMempWHEREempno=v_empno;IFv_sal<=1500THENUPDATEempSETsal=sal+100WHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'員工工資已更新!');ELSEDBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'員工工資已經(jīng)超過規(guī)定值!');ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫中沒有編碼為'||v_empno||'的員工');WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE('程序運行錯誤!請使用游標(biāo)');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);END;實例DECLARE非預(yù)定義的異常處理非定義的ORACLE錯誤進(jìn)行定義,步驟如下:1. 在PL/SQL塊的定義部分定義異常情況:<異常情況>EXCEPTION;2. 將其定義好的異常情況,與標(biāo)準(zhǔn)的ORACLE錯誤聯(lián)系起來,使用EXCEPTION_INIT語句:PRAGMAEXCEPTION_INIT(<異常情況>,<錯誤代碼>);3. 在PL/SQL塊的異常情況處理部分對異常情況做出相應(yīng)的處理。非預(yù)定義的異常處理非定義的ORACLE錯誤進(jìn)行定義,步驟如下示例INSERTINTOdeptVALUES(50,‘FINANCE’,‘CHICAGO’);DECLAREv_deptnodept.deptno%TYPE:=&deptno;deptno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(deptno_remaining,-2292);/*-2292是違反一致性約束的錯誤代碼*/BEGINDELETEFROMdeptWHEREdeptno=v_deptno;EXCEPTIONWHENdeptno_remainingTHENDBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完整性約束!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);END;示例INSERTINTOdeptVALUES(50,存儲函數(shù)和過程ORACLE提供可以把PL/SQL程序存儲在數(shù)據(jù)庫中,并可以在任何地方來運行它。這樣就叫存儲過程或函數(shù)。過程和函數(shù)統(tǒng)稱為PL/SQL子程序,他們是被命名的PL/SQL塊,均存儲在數(shù)據(jù)庫中,并通過輸入、輸出參數(shù)或輸入/輸出參數(shù)與其調(diào)用者交換信息。過程和函數(shù)的唯一區(qū)別是函數(shù)總向調(diào)用者返回數(shù)據(jù),而過程則不返回數(shù)據(jù)。在本節(jié)中主要介紹:創(chuàng)建存儲過程和函數(shù);建立和管理存儲過程和函數(shù)。存儲函數(shù)和過程ORACLE提供可以把PL/SQL程序存儲創(chuàng)建函數(shù)語法如下:CREATE[orREPLACE]FUNCTIONfunction_name[(argment[{in|inout}]TYPE,argment[{in|out|inout}]type]RETURNRETURN_type{IS|AS}BEGINFUNCTION_bodyEXCEPTION......ENDfunction_name;創(chuàng)建函數(shù)語法如下:CREATE[orREPLACE]創(chuàng)建函數(shù)示例CREATEORREPLACEFUNCTIONget_salary( Dept_noNUMBER, Emp_countOUTNUMBER) RETURNNUMBERIS V_sumNUMBER;BEGIN SELECTSUM(sal),count(*)INTOV_sum,emp_count FROMempWHEREdeptno=dept_no; RETURNv_sum;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)不存在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDget_salary;創(chuàng)建函數(shù)示例CREATEORREPLACEFUNC函數(shù)的調(diào)用格式為:
argument_value1[,argument_value2…]函數(shù)的調(diào)用格式為:函數(shù)的調(diào)用實例DECLARE V_numNUMBER; V_sumNUMBER;BEGIN V_sum:=get_salary(30,v_num); DBMS_OUTPUT.PUT_LINE('30號部門工資總和:'||v_sum||',人數(shù):'||v_num);END;運行結(jié)果:30號部門工資總和:9400,人數(shù):6函數(shù)的調(diào)用實例DECLARE創(chuàng)建過程創(chuàng)建過程語法:CREATE[ORREPLACE]PROCEDUREProcedure_name[(argment[{IN|OUT|INOUT}]Type,argment[{IN|OUT|INOUT}]Type] [AUTHIDDEFINER|CURRENT_USER]{IS|AS}<類型.變量的說明>BEGIN<執(zhí)行部分>EXCEPTION<可選的異常錯誤處理程序>END;創(chuàng)建過程創(chuàng)建過程語法:CREATE[ORREPLACE實例1CREATEtablelogtable(useridVARCHAR2(10),logdatedate);CREATEORREPLACEPROCEDURElogexecutionISBEGININSERTINTOlogtable(userid,logdate)VALUES(USER,SYSDATE);END;實例1CREATEtablelogtable(use實例2CREATEORREPLACEPROCEDUREDelEmp(v_empnoINemp.empno%TYPE)ASNo_resultEXCEPTION;BEGINDELETEFROMempWHEREempno=v_empno;IFSQL%NOTFOUNDTHENRAISEno_result;ENDIF;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'的員工已被除名!');EXCEPTIONWHENno_resultTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)不存在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDDelEmp;實例2CREATEORREPLACEPROCEDUR實例3CREATEORREPLACEPROCEDUREInsertEmp(v_empnoinemp.empno%TYPE,v_nameinemp.ename%TYPE,v_deptnoinemp.deptno%TYPE)ASempno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(empno_remaining,-1);/*-1是違反唯一約束條件的錯誤代碼*/BEGININSERTINTOemp(empno,ename,hiredate,deptno) VALUES(v_empno,v_name,sysdate,v_deptno);DBMS_OUTPUT.PUT_LINE('插入數(shù)據(jù)記錄成功!');EXCEPTIONWHENempno_remainingTHENDBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完整性約束!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDInsertEmp;實例3CREATEORREPLACEPROCEDUR調(diào)用存儲過程ORACLE使用EXECUTE語句來實現(xiàn)對存儲過程的調(diào)用:EXEC[UTE]Procedure_name(parameter1,parameter2…);調(diào)用存儲過程ORACLE使用EXECUTE語句來實現(xiàn)對存存儲過程和調(diào)用實例1CREATEORREPLACEPROCEDUREQueryEmp(v_empnoINemp.empno%TYPE, v_enameOUTemp.ename%TYPE, v_salOUTemp.sal%TYPE)ASBEGIN SELECTename,salINTOv_ename,v_salFROMempWHEREempno=v_empno; DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'的員工已經(jīng)查到!');EXCEPTION WHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)不存在!'); WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDQueryEmp;存儲過程和調(diào)用實例1CREATEORREPLACE實例2DECLAREv1emp.ename%TYPE;v2emp.sal%TYPE;BEGINQueryEmp(7788,v1,v2);DBMS_OUTPUT.PUT_LINE('姓名:'||v1);DBMS_OUTPUT.PUT_LINE('工資:'||v2);QueryEmp(7902,v1,v2);DBMS_OUTPUT.PUT_LINE('姓名:'||v1);DBMS_OUTPUT.PUT_LINE('工資:'||v2);QueryEmp(8899,v1,v2);DBMS_OUTPUT.PUT_LINE('姓名:'||v1);DBMS_OUTPUT.PUT_LINE('工資:'||v2);END;運行結(jié)果:編碼為7788的員工已經(jīng)查到!姓名:SCOTT工資:3000編碼為7902的員工已經(jīng)查到!姓名:FORD工資:3000你需要的數(shù)據(jù)不存在!姓名:工資:實例2DECLARE運行結(jié)果:實例3CREATEORREPLACEPROCEDUREproc_demo(Dept_noNUMBERDEFAULT10, Sal_sumOUTNUMBER, Emp_countOUTNUMBER)ISBEGIN SELECTSUM(sal),COUNT(*)INTOsal_sum,emp_countFROMempWHEREdeptno=dept_no;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)不存在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);ENDproc_demo;實例3CREATEORREPLACEPROCEDURE實例4DECLAREV_numNUMBER;V_sumNUMBER(8,2);BEGIN Proc_demo(30,v_sum,v_num);DBMS_OUTPUT.PUT_LINE('30號部門工資總和:'||v_sum||',人數(shù):'||v_num); Proc_demo(sal_sum=>v_sum,emp_count=>v_num);DBMS_OUTPUT.PUT_LINE('10號部門工資總和:'||v_sum||',人數(shù):'||v_num);END;運行結(jié)果:30號部門工資總和:9400,人數(shù):610號部門工資總和:8750,人數(shù):3實例4DECLARE運行結(jié)果:實例5DECLAREV_numNUMBER;V_sumNUMBER(8,2);PROCEDUREproc_demo (Dept_noNUMBERDEFAULT10, Sal_sumOUTNUMBER, Emp_countOUTNUMBER)ISBEGIN SELECTSUM(sal),COUNT(*)INTOsal_sum,emp_countFROMempWHEREdeptno=dept_no;EXCEPTION實例5DECLARE實例5續(xù)…WHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)不存在!');WHENOTHERSTHEN DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDproc_demo;BEGIN Proc_demo(30,v_sum,v_num);DBMS_OUTPUT.PUT_LINE('30號部門工資總和:'||v_sum||',人數(shù):'||v_num); Proc_demo(sal_sum=>v_sum,emp_count=>v_num);DBMS_OUTPUT.PUT_LINE('10號部門工資總和:'||v_sum||',人數(shù):'||v_num);END;運行結(jié)果:30號部門工資總和:9400,人數(shù):610號部門工資總和:8750,人數(shù):3實例5續(xù)…WHENNO_DATA_FOUNDTHEN運刪除過程和函數(shù)刪除過程
:語法如下:DROPPROCEDURE[user.]Procudure_name;刪除函數(shù):語法如下:DROPFUNCTION[user.]Function_name;刪除過程和函數(shù)刪除過程:包的創(chuàng)建和應(yīng)用一個包由兩個分開的部分組成:包定義(PACKAGE):包定義部分聲明包內(nèi)數(shù)據(jù)類型、變量、常量、游標(biāo)、子程序和異常錯誤處理等元素,這些元素為包的公有元素。包主體(PACKAGEBODY):包主體則是包定義部分的具體實現(xiàn),它定義了包定義部分所聲明的游標(biāo)和子程序,在包主體中還可以聲明包的私有元素。包定義和包主體分開編譯,并作為兩部分分開的對象存放在數(shù)據(jù)庫字典中,詳見數(shù)據(jù)字典user_source,all_source,dba_source.包的創(chuàng)建和應(yīng)用一個包由兩個分開的部分組成:包的定義創(chuàng)建包定義:CREATE[ORREPLACE]PACKAGEpackage_name[AUTHID{CURRENT_USER|DEFINER}]{IS|AS}[公有數(shù)據(jù)類型定義[公有數(shù)據(jù)類型定義]…][公有游標(biāo)聲明[公有游標(biāo)聲明]…][公有變量、常量聲明[公有變量、常量聲明]…][公有子程序聲明[公有子程序聲明]…]END[package_name];包的定義創(chuàng)建包定義:CREATE[ORREPLACE]包的定義創(chuàng)建包主體
:CREATE[ORREPLACE]PACKAGEBODYpackage_name{IS|AS}[私有數(shù)據(jù)類型定義[私有數(shù)據(jù)類型定義]…][私有變量、常量聲明[私有變量、常量聲明]…][私有子程序聲明和定義[私有子程序聲明和定義]…][公有游標(biāo)定義[公有游標(biāo)定義]…][公有子程序定義[公有子程序定義]…]BEGINPL/SQL語句END[package_name];包的定義創(chuàng)建包主體:CREATE[ORREPLACE]包的開發(fā)步驟與開發(fā)存儲過程類似,包的開發(fā)需要幾個步驟:將每個存儲過程調(diào)式正確;用文本編輯軟件將各個存儲過程和函數(shù)集成在一起;按照包的定義要求將集成的文本的前面加上包定義;按照包的定義要求將集成的文本的前面加上包主體;使用SQLPLUS或開發(fā)工具進(jìn)行調(diào)式。包的開發(fā)步驟與開發(fā)存儲過程類似,包的開發(fā)需要幾個步驟:創(chuàng)建包實例CREATEORREPLACEPACKAGEdemo_packIS DeptRecdept%ROWTYPE; FUNCTIONadd_dept(dept_noNUMBER,dept_nameVARCHAR2,locationVARCHAR2) RETURNNUMBER; FUNCTIONremove_dept(dept_noNUMBER) RETURNNUMBER;
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球高架軌道秤行業(yè)調(diào)研及趨勢分析報告
- 2025打工人發(fā)財游園年會(打工人發(fā)財年會主題)活動策劃方案
- 建筑節(jié)能的規(guī)劃與實施策略
- 健身休閑行業(yè)服務(wù)交易合同范文
- 會計勞動合同模板
- 掌握數(shù)據(jù)分析的關(guān)鍵技能
- 石材幕墻施工合同范本
- 買賣合同原告代理詞
- 2025個人與個人合作協(xié)議合同
- 2025禽蛋類購買合同樣本
- 2025年春新北師大版物理八年級下冊課件 第七章 運動和力 第四節(jié) 同一直線上二力的合成
- 《肝硬化的臨床表現(xiàn)》課件
- 新增值稅法學(xué)習(xí)課件
- 飛書項目管理
- 醫(yī)院醫(yī)共體2025年度工作計劃
- 《酶聯(lián)免疫分析技術(shù)》課件
- 鮮棗貯藏技術(shù)規(guī)程
- DB23T 3838-2024商貿(mào)行業(yè)有限空間個體防護(hù)裝備配備規(guī)范
- 2024年循環(huán)水操作工(中級)職業(yè)鑒定理論考試題庫((含答案))
- 《電子技術(shù)基礎(chǔ)(第二版)》中職技工全套教學(xué)課件
- 人教版五年級上冊小數(shù)乘除法豎式計算題200道及答案
評論
0/150
提交評論