函數是一個能夠計算結果值的子程序,函數除了有一個RETURN子句之外,其它結構跟過程類似。值得 注意的是,Oracle中的函數必須提供返回值,如果你定義的子程序沒有返回值,那麼你不應該把它定義 成函數,而應該定義成過程。
一、函數
示例1:創建不帶參數的函數
CREATE OR REPLACE FUNCTION currentTime --沒有參數,不能加括號
RETURN VARCHAR2
AS
BEGIN
RETURN TO_CHAR(SYSDATE,'YYYY"年"MM"月 "DD"日"HH24"時"MI"分"SS"秒"');
END;
既然函數有返回值,那麼函數就可以在允許有表達式的地方出現(帶有輸出參數或輸入輸出參數的函 數除外)如:
DECLARE
myStr VARCHAR2(30);
BEGIN
myStr:=currentTime;
DBMS_OUTPUT.PUT_LINE(myStr);
END;
也可以使用SELECT語句查看函數的返回值:
SELECT currentTime FROM DUAL;
示例2:創建帶有輸入參數的函數
CREATE OR REPLACE FUNCTION getEmpNameByEmpNo(no [IN] NUMBER)
RETURN VARCHAR2
AS
name VARCHAR2(20);
BEGIN
SELECT eName INTO name FROM EMP WHERE empNo=no;
RETURN name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
name:=' 無此員工';
RETURN name;
END;
示例3:創建帶有輸出參數的函數
CREATE OR REPLACE FUNCTION getEmpNameAndJobByEmpNo(no NUMBER,job OUT VARCHAR2)
RETURN VARCHAR2
AS
name VARCHAR2(20);
BEGIN
SELECT eName,job INTO name,job FROM EMP WHERE empNo=no;
RETURN name;
END;
調用方式如下:
DECLARE
job emp.job%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE (getEmpNameAndJobByEmpNo(7788,job));
DBMS_OUTPUT.PUT_LINE(job);
END;
示例4:創建帶有默認值的函數
CREATE OR REPLACE FUNCTION getEmpNameAndJobByEmpNo(no NUMBER DEFAULT 7788,job OUT VARCHAR2)
RETURN VARCHAR2
AS
name VARCHAR2(20);
BEGIN
SELECT eName,job INTO name,job FROM EMP WHERE empNo=no;
RETURN name;
END;
調用方式如下:
DECLARE
job EMP.JOB%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE (getEmpNameAndJobByEmpNo(job=>job));
DBMS_OUTPUT.PUT_LINE(job);
END;
示例5:創建帶有輸入輸出參數的函數
CREATE OR REPLACE FUNCTION getHiredateAndJobByEmpName(nb IN OUT VARCHAR2)
RETURN DATE
AS
hireDate DATE;
BEGIN
SELECT hiredate,job INTO hireDate,nb FROM EMP WHERE eName=nb;
RETURN hireDate;
END;
當函數中有輸出參數時,不能直接通過SELECT語句查看,必須在BEGIN END塊中調用,如下:
DECLARE
n emp.eName%TYPE:='SCOTT';
BEGIN
DBMS_OUTPUT.PUT_LINE (getHiredateAndJobByEmpName(n));
DBMS_OUTPUT.PUT_LINE(n);
END;
二、維護函數
1、刪除函數
DROP FUNCTION Fun_Name;
2、查看函數狀態
SELECT object_name,status FROM USER_OBJECTS WHERE object_type='FUNCTION';
3、重新編譯函數
ALTER FUNCTION Fun_Name COMPILE;
4、查看函數代碼
SELECT * FROM USER_SOURCE WHERE TYPE='FUNCTION'