PL SQL程式設計整理6 函式

2021-09-30 05:30:16 字數 3807 閱讀 9950

函式用於返回特定的資料,當建立函式時,在函式頭部必須包含return字句,而在函式體內必須包含return語句返回的資料,使用create function來建立函式。

語法如下:

create [or replace] function function_name

[(argment [ ] type,

argment [ ] type]

return return_type

《型別.變數的說明》

begin

function_body

exception

其它語句

end;

例1.獲取某部門的工資總和:

create or replace function get_salary(

dept_no number,

emp_count out number)

return number is

v_sum number;

begin

select sum(sal), count(*) into v_sum, emp_count

from emp where deptno=dept_no;

return v_sum;

exception

when no_data_found then

dbms_output.put_line('你需要的資料不存在!');

when too_many_rows then

dbms_output.put_line('程式執行錯誤!請使用游標');

when others then

dbms_output.put_line('發生其它錯誤!');

end get_salary;

1.內嵌函式的呼叫

函式宣告時所定義的引數稱為形式引數,應用程式呼叫時為函式傳遞的引數稱為實際引數。應用程式在呼叫函式時,可以使用以下三種方法向函式傳遞引數:

第一種引數傳遞格式稱為位置表示法,格式為:

argument_value1[,argument_value2 …]

例2:計算某部門的工資總和:

declare

v_num number;

v_sum number;

begin

v_sum :=get_salary(30, v_num);

dbms_output.put_line(』30號部門工資總和:』||v_sum||』,人數:』||v_num);

end;

第二種引數傳遞格式稱為名稱表示法,格式為:

argument => parameter [,…]

其中:argument 為形式引數,它必須與函式定義時所宣告的形式引數名稱相同。parameter 為實際引數。

在這種格式中,形勢引數與實際引數成對出現,相互間關係唯一確定,所以引數的順序可以任意排列。

例3:計算某部門的工資總和:

declare

v_num number;

v_sum number;

begin

v_sum :=get_salary(emp_count => v_num, dept_no => 30);

dbms_output.put_line(』30號部門工資總和:』||v_sum||』,人數:』||v_num);

end;

第三種引數傳遞格式稱為混合表示法:

即在呼叫乙個函式時,同時使用位置表示法和名稱表示法為函式傳遞引數。採用這種引數傳遞方法時,使用位置表示法所傳遞的引數必須放在名稱表示法所傳遞的引數前面。也就是說,無論函式具有多少個引數,只要其中有乙個引數使用名稱表示法,其後所有的引數都必須使用名稱表示法。

例4:

create or replace function demo_fun(

name varchar2,

age integer,

*** varchar2)

return varchar2

as v_var varchar2(32);

begin

v_var := name||』:『||to_char(age)||』歲,』||***;

return v_var;

end;

declare

var varchar(32);

begin

var := demo_fun(『user1』, 30, *** => 『男』);

dbms_output.put_line(var);

var := demo_fun(『user2』, age => 40, *** => 『男』);

dbms_output.put_line(var);

var := demo_fun(『user3』, *** => 『女』, age => 20);

dbms_output.put_line(var);

end;

無論採用哪一種引數傳遞方法,實際引數和形式引數之間的資料傳遞只有兩種方法:傳址法和傳值法。所謂傳址法是指在呼叫函式時,將實際引數的位址指標傳遞給形式引數,使形式引數和實際引數指向記憶體中的同一區域,從而實現引數資料的傳遞。這種方法又稱作參照法,即形式引數參照實際引數資料。輸入引數均採用傳址法傳遞資料。

傳值法是指將實際引數的資料拷貝到形式引數,而不是傳遞實際引數的位址。預設時,輸出引數和輸入/輸出引數均採用傳值法。在函式呼叫時,oracle將實際引數資料拷貝到輸入/輸出引數,而當函式正常執行退出時,又將輸出形式引數和輸入/輸出形式引數資料拷貝到實際引數變數中。

2.引數預設值

在create or replace function 語句中宣告函式引數時可以使用default關鍵字為輸入引數指定預設值。

例5:

create or replace function demo_fun(

name varchar2,

age integer,

*** varchar2 default 『男』)

return varchar2

as v_var varchar2(32);

begin

v_var := name||』:『||to_char(age)||』歲,』||***;

return v_var;

end;

具有預設值的函式建立後,在函式呼叫時,如果沒有為具有預設值的引數提供實際引數值,函式將使用該引數的預設值。但當呼叫者為預設引數提供實際引數時,函式將使用實際引數值。在建立函式時,只能為輸入引數設定預設值,而不能為輸入/輸出引數設定預設值。

declare

var varchar(32);

begin

var := demo_fun(『user1』, 30);

dbms_output.put_line(var);

var := demo_fun(『user2』, age => 40);

dbms_output.put_line(var);

var := demo_fun(『user3』, *** => 『女』, age => 20);

dbms_output.put_line(var);

end;

PLSQL程式設計

create table emomy1 emon varchar2 100 time1 date drop table emomy1 select from emomy1 begin dbms output.put line hello,world end 定義變數 declare name con...

PL SQL程式設計

1.具有程式語言的特點,他能把一組sql語句放到乙個模組中,使去更具有模組的程式的特點 2.採用過程性語言控制程式的結構,也就是說,在pl sql中增強邏輯結構,如迴圈,判斷等程式結構 3.pl sql可以對程式中的錯誤進行自動處理,使程式能夠在遇到錯誤時不會中斷,及他的處理異常機制 4.具有更好的...

PL SQL 程式設計

pl sql 程式結構 declare 宣告部分 宣告變數 型別 游標以及布局的儲存過程及函式 begin 執行部分 過程及sql語句,程式的主要部分,是必須的 end eg 基表為course declare v cno varchar 20 001 begin select from cours...