要想利用pl/sql程序完成比較完整的數據庫任務,需要進一步學習一些高級設計要素的內容。前面編寫執行的pl/sql程序,共同的特點是沒有名稱,只能存儲為文件,然后通過執行文件的方式執行,因此稱為無名塊。與此對應的是在pl/sql中也引入了高級程序設計的一些概念,其中最重要的就是過程。
過程就是高級程序設計語言中的模塊的概念,將一些內部聯系的命令組成一個個過程,通過參數在過程之間傳遞數據是模塊化設計思想的重要內容。
創建過程
1. 過程的語法結構
完整的過程結構如下:
create or replace procedure 過程名 as
聲明語句段;
begin
執行語句段;
exception
異常處理語句段;
end;
2. 過程的特點
過程是有名稱的程序塊,as關鍵詞代替了無名塊的declare。
3. 創建過程實例
在【sqlplus worksheet】中執行下列pl/sql程序,該程序將創建名為tempprocedure的過程,create是創建過程的標識符,replace表示若同名過程存在將覆蓋原過程。該過程定義了一個變量,其類型和testtable數據表中的currentdate字段類型相同,都是日期型,將數據表中的recordnumber字段為88的currentdate字段內容送入變量中,然后輸出結果。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
create or replace procedure tempuser.tempprocedure as
tempdate tempuser.testtable.currentdate%type;
begin
select currentdate
into tempdate
from testtable
where recordnumber=88;
dbms_output.put_line(to_char(tempdate));
end;
―――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章/ createprocedure.sql。
執行結果如圖9.41所示。
查詢過程
登錄【企業管理器】,在【管理目標導航樹】里選擇【網絡】/【數據庫】/【myoracle.mynet】/【方案】/【過程】/【tempuser】選項,出現如圖9.42所示的創建好的過程。
修改過程
(1)在【sqlplus worksheet】的【菜單欄】選擇【文件】/【打開】菜單命令,將創建過程的createprocedure.sql文件調出進行修改,修改完畢后重新執行創建過程。
(2)在【企業管理器】里選中要修改的過程,用鼠標右鍵單擊,在出現的快捷菜單里選擇【查看/編輯詳細資料】選項,如圖9.43所示。
(3)出現如圖9.44所示的編輯過程的【一般信息】選項卡。在【文本編輯區】可以編輯該過程,單擊“確定”按鈕將更新該過程,單擊“編譯”按鈕將編譯該過程的 pl/sql 源代碼,使該過程可以在數據庫中存儲和執行。
執行過程
要執行創建的過程,必須通過主程序來調用過程。
在【sqlplus worksheet】中執行下列pl/sql程序,執行結果如圖9.45所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
begin
tempprocedure;
end;
―――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章/ executeprocedure.sql。
在oracle中,創建好的過程可以被任何程序調用。
帶參數的過程
前面介紹的過程沒有參數,主程序和過程沒有數據的傳遞,下面介紹帶參數的過程的設計和使用。
1. 參數類型
在pl/sql過程中,可以有3種類型的參數。
in參數:讀入參數,主程序向過程傳遞參數值。
out參數:讀出參數,過程向主程序傳遞參數值。
in out 參數:雙向參數,過程與主程序雙向交流數據。
2. 定義帶參數的過程
在下面的pl/sql程序代碼中,將創建三個調用參數。
tempdeptno:類型為in,與scott.dept.deptno的類型一致,為數值型。
tempdname:類型為out,與scott.dept.dname的類型一致,為字符型。
temploc:類型為in out,與scott.dept.loc類型一致,為字符型。
創建兩個過程內參數。
loc1:與scott.dept.loc的類型一致,為字符型。
dname1:與scott.dept.dname的類型一致,為字符型。
該帶參數的過程的功能是從數據表scott.dept中尋找deptno字段等于tempdeptno調用參數值的dname和loc字段,和其他字符組合,送給兩個出口參數。
以system用戶名、sysdba身份登錄【sqlplus worksheet】,執行下列pl/sql程序,執行結果如圖9.46所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
create or replace procedure scott.tempprocedure(
tempdeptno in scott.dept.deptno%type,
tempdname out scott.dept.dname%type,
temploc in out scott.dept.loc%type)as
loc1 scott.dept.loc%type;
dname1 scott.dept.dname%type;
begin
select loc into loc1
from scott.dept
where deptno=tempdeptno;
select dname into dname1
from scott.dept
where deptno=tempdeptno;
temploc:='地址:'||loc1;
tempdname:='姓名'||dname1;
end;
―――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章/ createscottprocedure.sql。
調用參數分割用“,”號。
3. 使用帶參數的過程
在主程序中的實際參數和過程中的形式參數的傳遞有很多種辦法,這里推薦讀者采用一一對應的辦法,按對應的位置傳遞參數。要求實際參數和形式參數在數據類型和位置排列上做到完全一致。
在【sqlplus worksheet】中執行下列pl/sql程序,該程序調用帶參數的過程scott.tempprocedure,實際參數為(10,’’,’’)
執行結果如圖9.47所示。
【配套程序位置】:第9章/ executescottprocedure.sql。
讀者可以嘗試改變參數值,然后測試過程執行結果。
新聞熱點
疑難解答