【文章內(nèi)容簡介】
DATE emp SET sal=* WHERE CURRENT OF sal_cursor。 END LOOP。 COMMIT。 END。 過程和函數(shù) ? PL/SQL程序塊有兩類: 匿名塊 — 以 DECLARE、 BEGIN開始,每次提交時(shí)都編譯,不存儲在數(shù)據(jù)庫中,也不能直接從其他的 PL/SQL塊中調(diào)用 . 命名塊 —存儲在數(shù)據(jù)庫中,預(yù)編譯??梢栽?PL/SQL塊中調(diào)用。包括: 過程和函數(shù) , 運(yùn)行方式類似其他 3GL的過程和函數(shù) 例如: 一個(gè)向員工信息表 emp插入一條新記錄的過程。該記錄包括員工編號、姓名、工作、上司編號、雇傭時(shí)間、工資、獎(jiǎng)金、和部門編號 。 CREATE OR REPLACE PROCEDURE hirenewemployee ( p_empno %TYPE, p_ename %TYPE, p_job %TYPE, p_mgr %TYPE, p_hiredate %TYPE, 過程和函數(shù) (續(xù) ) p_sal %TYPE, p_m %TYPE, p_deptno %TYPE) AS BEGIN INSERT INTO emp(empno,ename,job,mgr, hiredate,sal,m,deptno) VALUES(p_empno,p_ename,p_job,p_mgr, p_hiredate,p_sal,p_m,p_deptno)。 END hirenewemployee。 在其他 PL/SQL塊中調(diào)用 : BEGIN hirenewemployee(7439,39。Brush39。,39。Analyst39。,7566, 39。019月 0139。,3000,NULL,20)。 END。 過程 ?CREATE PROCEDURE語句來創(chuàng)建過程: CREATE [ OR REPLACE ] PROCEDURE過程名 [( 參數(shù)名 [ IN | OUT | IN OUT ]數(shù)據(jù)類型 , … 參數(shù)名 [ IN | OUT | IN OUT ]數(shù)據(jù)類型 )] IS | AS [ 局部變量聲明 ] BEGIN 過程體 END [ 過程名 ]。 過程 (續(xù) ) 【例】創(chuàng)建示例過程 ResetPwd,此過程的功能是將表 Users中指定用戶的密碼重置為 111111: CREATE OR REPLACE PROCEDURE ( UserId IN NUMBER ) AS BEGIN UPDATE Users SET UserPwd = 39。11111139。 WHERE UserId = UserId。 END。 在 SQL*PLUS中執(zhí)行過程 : SQL (1001)。 函數(shù) 【例】編寫一個(gè)員工應(yīng)交的個(gè)人所得稅金的函數(shù),個(gè)人所得稅等于本人工資的 8%。 CREATE OR REPLACE FUNCTION tax(p_empno IN NUMBER) RETURN NUMBER IS v_sal NUMBER。 v_returnvalue NUMBER。 BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=p_empno。 v_returnvalue:=v_sal*。 RETURN v_returnvalue。 END tax。 函數(shù) (續(xù) ) 【例】 PL/SQL塊調(diào)用 tax函數(shù)。 DECLARE CURSOR c_employee IS SELECT empno,ename FROM emp。 BEGIN FOR v_emprecord IN c_employee LOOP Output all the employees tax (|| 39。tax is39。|| TO_CHAR(tax())||39。.39。)。 END LOOP。 END。 函數(shù) (續(xù) ) ?CREATE FUNCTION語句來創(chuàng)建函數(shù): CREATE [ OR REPLACE ] FUNCTION 函數(shù)名 [( 參數(shù)名 [ IN | OUT | IN OUT ]數(shù)據(jù)類型 , … 參數(shù)名 [ IN | OUT | IN OUT ]數(shù)據(jù)類型 )] [ RETURN 函數(shù)返回值的類型 ] IS | AS [ 局部變量聲明 ] BEGIN 過程體 RETURN 函數(shù)返回值 END [ 過程名 ]。 函數(shù) (續(xù) ) 【例】編寫一個(gè)員工應(yīng)交的個(gè)人所得稅金的函數(shù),當(dāng)工資低于 800元時(shí),個(gè)人所得稅為 0,當(dāng)工資在 800至 1499元之間時(shí),個(gè)人所得稅為工資的 5%,當(dāng)工資在 1500至 1999元之間時(shí),個(gè)人所得稅為為工資的 10%,當(dāng)工資在2023至 2999元之間時(shí),個(gè)人所得稅為為工資的 15%,當(dāng)工資在 3000時(shí),個(gè)人所得稅為為工資的 20% 。 CREATE OR REPLACE FUNCTION taxinfo(p_empno IN NUMBER) RETURN NUMBER IS v_sal NUMBER。 v_returnvalue NUMBER。 BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=p_empno。 函數(shù) (續(xù) ) IF v_sal800 THEN v_returnvalue:=0。 RETURN v_returnvalue。 ELSIF v_sal=800 AND v_sal1500 THEN v_returnvalue:=v_sal*。 RETURN v_returnvalue。 ELSIF v_sal=1500 AND v_sal2023 THEN v_returnvalue:=v_sal*。 RETURN v_returnvalue。 ELSIF v_sal=2023 AND v_sal3000 THEN v_returnvalue:=v_sal*。 RETURN v_returnvalue。 ELSIF v_sal=3000 THEN v_returnvalue:=v_sal*。 RETURN v_returnvalue。 ENDIF。 END taxinfo。 函數(shù) (續(xù) ) 【例】 PL/SQL塊調(diào)用 tax函數(shù)。 DECLARE CURSOR c_employee IS SELECT empno,ename FROM emp。 BEGIN FOR v_emprecord IN c_employee LOOP Output all the employees’ tax (|| ’’’ tax is’ || TO_CHAR(taxinfo())||’ .’ )。 END LOOP。 END。 函數(shù) (續(xù) ) 【例】下面介紹一個(gè)示例函數(shù) GetPwd,此函數(shù)的功能是在表Users中根據(jù)指定的用戶名返回該用戶的密碼信息: CREATE OR REPLACE FUNCTION ( name IN %Type ) RETURN %Type AS outpwd %Type。 BEGIN SELECT UserPwd INTO outpwd FROM Users WHERE UserName=name。 RETURN outpwd。 END。 函數(shù) (續(xù) ) 【例】 用 查詢語句調(diào)用 。 SQLSELECT (‘ Admin’ ) 密碼 2 FROM dual。 【例】 用 PL/SQL塊調(diào)用 SQLDECLARE 2 v_pwd %TYPE。 3 BEGIN 4 SET v_pwd:= (‘ Admin’ ) 5 (v_pwd)。 6 END。 7 / 函數(shù) (續(xù) ) ?刪除過程和函數(shù) DROP PROCEDURE 過程名 DROP FUNCTION 函數(shù)名 ?過程函數(shù)的參數(shù)傳遞 參數(shù)模式 何為形參和實(shí)參? 形參 過程函數(shù)中聲明的參數(shù) 實(shí)參 – 在 PL/SQL塊中聲明的變量,包含了過程函數(shù)被調(diào)用時(shí)傳遞給過程和函數(shù)的值,當(dāng)調(diào)用過程和函數(shù)時(shí)形參被賦予實(shí)參值 IN – 默認(rèn) ,過程被調(diào)用時(shí),實(shí)參的值將傳入該過程 形參 ,在過程內(nèi)不。能再賦值 ,該值只讀不能修改,調(diào)用結(jié)束時(shí) 返回調(diào)用環(huán)境,實(shí)參沒有改變。 OUT –過程被調(diào)用時(shí),實(shí)參的值不能傳入該過程形參,形參在過程體內(nèi)必須被賦值 ,調(diào)用結(jié)束時(shí) 返回調(diào)用環(huán)境 ,形參的內(nèi)容將賦予對應(yīng)的實(shí)參,形參具有讀寫性。 IN OUT –為 IN 和 OUT 的組合 函數(shù) (續(xù) ) 形參和實(shí)參之間傳遞數(shù)值 按值傳遞時(shí) 實(shí)參的值將賦予對應(yīng)的形參 (OUT,IN OUT), 按引用傳遞時(shí) 一個(gè)指向?qū)崊⒌闹羔槍⒈粋鬟f的值到對應(yīng)的形參 (IN) 對形參的約束 過程函數(shù)中聲明的形參的數(shù)據(jù)類型不能指定長度和精度。應(yīng)為這些約束可以從實(shí)參中獲得。 ? 過程與函數(shù)比較 1. 通過設(shè)置 OUT參數(shù),過程和函數(shù)都可以返回一個(gè)以上的值 2. 過程和函數(shù)都具有聲明、執(zhí)行、異常處理部分 3. 都可以使用位置或名稱對應(yīng)調(diào)用過程和函數(shù) 4. 函數(shù)可以在表達(dá)式和 SQL語句中調(diào)用,過程不行 一般來說:返回一個(gè)值用函數(shù),一個(gè)以上用過程 子程序和包 包的概念 包的聲明 包體 重載封裝子程序 包的管理 系統(tǒng)預(yù)定義包 2/27/2023 Oracle 10g管理及應(yīng)用 包的概念 在 Oracle中,對于邏輯上相關(guān)的類型、變量及子程序等可以集成在一起,組成命名的 PL/SQL程序塊,這種特殊的程序塊稱為包。使用包可以有以下優(yōu)點(diǎn): ( 1)有效地隱藏信息 ( 2)實(shí)現(xiàn)集成化模塊程序設(shè)計(jì) ( 3)有利于 PL/SQL程序的維護(hù)和升級 包有兩個(gè)獨(dú)立的部分:包的聲明(包頭)和包體。 將分別存儲在數(shù)據(jù)字典中。包頭在包中是必不可少的組成部分,但包體有時(shí)可以不出現(xiàn)。在包中所有的子程序和游標(biāo)等必須在包頭中進(jìn)行聲明,然后,再在包體中使用。 包的聲明 ?CREATE PACKAGE語句來創(chuàng)建包的說明部分: CREATE [ OR REPLACE ] PACKAGE 包名 IS | AS [類型定義 ],[變量定義 ],[游標(biāo)定義 ], [異常定義 ],[函數(shù)定義 ],[過程定義 ] END [ 程序包名 ]。 包頭通常用來存儲一些共享變量,實(shí)現(xiàn)對靜態(tài)數(shù)據(jù)值的引用。在編譯過程中,由于先進(jìn)行包頭的編譯,所以如果包頭編譯不成功,則包體必定不能編譯成功,只有包頭和包體全部都編譯成功后包才能使用。 包的聲明 (續(xù) ) 【例】創(chuàng)建包頭,它包含有關(guān)包的內(nèi)容信息。然而,該部分中不包擴(kuò)任何子程序代碼。 CREATE OR REPLCACE PACKAGE employeepackage AS 類型定義 TYPE emprectype IS R