PL/SQL編程_子程式設計

來源:互聯網
上載者:User

標籤:

利用PL/SQL可以進行模組化程式設計

在一個PL/SQL塊中,可以定義若干個子程式

把一些功能相對獨立、需要經常執行的代碼定義為一個子程式,在需要時根據子程式的名字進行調用。
這樣不僅便於程式設計和編碼,而且利於程式的調試。
PL/SQL有兩種形式的子程式,即過程和函數。

在子程式中也可以定義變數、類型、遊標等,也可以進行異常處理。
在調用於程式時,可以向子程式傳遞參數。

過程與函數的區別在於函數具有傳回值,可以向調用者返回執行結果,而過程沒有傳回值。

如何使用過程

子程式的定義出現在PL/SQL塊的聲明部分,而它的調用則出現在PL/SQL塊的可執行部分。
過程的定義格式如下:

PROCEDURE 過程名稱 (參數1 定義, 參數2 定義 ...)

AS 或 IS

變數聲明部分

BEGIN

可執行部分

EXCEPTION

異常處理部分

END;

在過程中可以定義參數,在調用該過程時,可以向過程傳遞實際參數。

如果沒有參數,則過程名後面的圓括弧及參數列表可以省略。

參數的定義形式為:

參數名 參數傳遞模式 資料類型 := 預設值

其中參數名和資料類型是必不可少的部分,其他兩部分是可以省略的。

參數傳遞模式包括INOUT以及IN OUT三種形式,其中IN是預設的傳遞模式,如果沒有指定,則預設為IN ,它指的是從調用者向過程中傳遞一個實際參數。

OUT是指從過程中向調用者傳遞參數,如果要使用這種傳遞模式,則需要明確指定。

在調用過程時,過程的執行情況會影響這個變數的值。
“ IN OUT”是一種雙向傳遞模式,一方面從調用者向過程傳遞參數,另一方面從過程向調用者傳遞結果,如果要使用這種形式,則需要明確指定。

          IN      OUT        IN OUT
形式參數的作用  一個常量  沒有初始化的變數  經過初始化的變數

實際參數的形式  常量、運算式、變數  必須是一個變數  必須是一個變數

參數預設值的作用是在調用過程時,如果沒有提供實際參數,則將此預設值作為實際參數傳遞給過程。
資料類型用來指定參數的類型,在參數定義中不能指定對參數的約束條件,即不能指定參數的長度和是否為空白等屬性。
在下面的PL/SQL塊中定義了兩個過程,其中prompt過程用於對某部門的員工增加工資和獎金,而total_income過程用於計算某部門員工的總收入和應繳的稅。

DECLARE
dno number;
procedure promption(salary IN integer, commiss IN integer, d_no IN integer:=0)
IS
BEGIN
if d_no=0 then --表示所有部門
UPDATE emp
set sal=sal+salary,comm=comm+commiss;
else --僅表示指定的部門
UPDATE emp
set sal=sal+salary,comm=comm+commiss
WHERE deptno=d_no;
END if;
END;
procedure total_income(d_no IN integer:=0)
IS
empno integer;
total number;
tax number;
BEGIN
if d_no=0 then --表示所有部門
SELECT sum(sal+nvl(comm, 0)), sum(sal*0.03) INTO total,tax FROM emp;
else --僅表示指定的部門
SELECT sum(sal+nvl(comm, 0)), sum(sal*0.03) INTO total,tax
FROM emp
WHERE deptno=d_no;
END if;
dbms_output.put_line (‘總收入:‘ || total || ‘總稅金: ‘ || tax) ;
END;
BEGIN --PL/SQL塊的可執行部分
dno:=10;
promption(100,0,dno);
total_income(dno);
END;

在過程promption 中定義了三個參數,其中參數d_no帶有預設值,這樣在調用該過程時,如果沒有為該參數提供實際參數,則使用預設值。
例如,在上述例子中,為部門10 中的員工增加了100元工資。
如果採用下面的調用形式,則為所有部門的員工增加100元工資:

promption(100, 0);

在調用過程時,需要為過程中的參數提供實際參數,它們在順序上是對應的。

為了保證將參數正確地傳給過程,要求在定義過程時,將所有帶預設值的參數集中放在參數列表的右邊。
因為只有這樣才能將其他實際參數一對一地賦給前面的不帶預設值的參數。
如果過程有多個參數,在調用過程時,也可以不按照參數列表的順序提供實際參數,這時需要兩種參數之間的對應關係。

例如,過程promption可以採用以下調用形式:
promption(d_no=>dno,commiss=>0, salary=>100);

過程total_inco1ne 中的參數d_no也帶有預設值,這樣在調用該過程時,如果提供了實際參數,則計算指定部門的員工總收入和總稅金,如果採用以下調用形式:

total_income ( ) ;

則計算所有部門的員工總收入和總稅金。
在上述兩個過程中,所有參數的傳遞模式都是IN ,即把實際參數從調用者傳遞給過程。

這種形式是預設的,可以省略的關鍵字。
如果需要把過程的執行情況反映給調用者,則需要使用OUT形式,或者“ IN OUT”形式。
例如,為了計算員工總收入和總稅金,並把結果反映到主程式中,對過程total_ income進行了一些改造,增加了兩個參數,傳遞模式都是OUT 。
改造後的PL/SQL塊代碼如下:

DECLARE
dno number;
abed number;
xyz number;
procedure total_income(d_no IN integer,total OUT number,tax OUT number)
AS
empno integer;
BEGIN
if d_no=0 then --表示所有部門
SELECT sum(sal+nvl(comm,0)), sum(sal*0.03) INTO total,tax FROM emp;
else --僅表示指定的部門
SELECT sum(sal+nvl(comm,0)), sum(sal*0.03) INTO total,tax
FROM emp
WHERE deptno=d_no;
END if;
END;
BEGIN
dno:=10;
--PL/SQL塊的可執行部分
total_income(dno,abed,xyz);
dbms_output.put_line (‘總收入: ‘ || abed || ‘ 總稅金: ‘ || xyz ) ;
END;

在調用過程total_income時,提供了三個實際參數,其中參數abed和xyz沒有實際的值即使有,在這裡也不起任何作用,因為這兩個參數的傳遞模式是OUT過程在執行時,將參數total和tax的值傳分別賦給abed和xyz ,這樣就將過程中的資料傳給了調用者。
註:IN型別參數是不能作為變數賦值的。

 

PL/SQL編程_子程式設計

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.