一、函式概述
? PL/SQL中的程序和函式(通常稱為子程式)是PL/SQL塊的一種特殊的型別,這種型別的子程式可以以編譯的形式存放在資料庫中,并為后續的程式塊呼叫,
? 相同點:完成特定功能的程式
? 不同點:是否用return陳述句回傳值
二、函式語法
CREATE [OR REPLACE] FUNCTION <函式名> [(<引數名> [IN | OUT | IN OUT] <資料型別> ,…)]
RETURN <回傳值型別>
IS |AS
[<變數或常量宣告>;]
BEGIN
<子程式塊...>;
RETURN <需要回傳的變數或常量名>;
[EXCEPTION
<例外處理...>;
RETURN <當出現例外時的回傳值、變數或常量>;]
END [<函式名>];
三、函式引數
? 函式的引數有3種型別:
? IN 引數型別:表示輸入給函式的引數,該引數只能用于傳值,不能被賦值,
? OUT 引數型別:表示引數在函式中被賦值,能夠傳給函式呼叫程式,該引數只能用于賦值,不能用于傳值,
? IN OUT 引數型別:表示引數既能夠傳值,也能夠被賦值,
四、無參函式
1)定義無參函式
create or replace function fn_PrintToday return date is begin return sysdate; end;
2)呼叫無參函式
--呼叫方式1 SELECT fn_PrintToday() FROM DUAL; --呼叫方式2 begin dbms_output.put_line(fn_PrintToday); end;
五、有參函式
5.1、帶輸入引數函式
1)定義帶輸入引數函式
create or replace function fn_SearchEmpByEmpno (p_empno varchar2) return varchar2 --回傳值型別 is v_ename emp.ename%type; --臨時變數 begin select ename into v_ename from emp where empno=p_empno; return v_ename; exception when no_data_found then raise_application_error(-20001,'您輸入的empno無效!'); end;
2)呼叫帶輸入引數函式
begin dbms_output.put_line(fn_SearchEmpByEmpno(p_empno=>'1001')); end;
5.2、帶輸出引數函式
1)定義帶輸出引數函式
create or replace function fn_CountEmp ( p_ename in varchar2, out_value out int ) return varchar2 is begin select count(1) into out_value from emp where ename=p_ename; return p_ename; end;
2)呼叫帶輸出引數函式
declare ename emp.ename%type; result int; begin ename:=fn_CountEmp(p_ename=>'James',out_value=>result); dbms_output.put_line(ename || '名字的有' || to_char(result) || '個人'); end;
六、維護函式
? 修改函式
? 與創建的語法相同,使用REPLACE替換即可,
? 洗掉函式
? drop function [schema.]函式名
七、函式相關
? 查看函式:SELECT * FROM USER_SOURCE WHERE USER_SOURCE.NAME='<函式名>';
SELECT * FROM USER_SOURCE WHERE NAME='FN_COUNTEMP';
? 編譯函式:ALTER FUNCTION 函式名 COMPILE;
ALTER FUNCTION FN_COUNTEMP COMPILE;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/499133.html
標籤:Oracle
