WEB开发网
开发学院数据库Oracle Oracle中的子程序之二函数 阅读

Oracle中的子程序之二函数

 2009-03-12 13:10:56 来源:WEB开发网   
核心提示:函数是一个能够计算结果值的子程序,函数除了有一个RETURN子句之外,Oracle中的子程序之二函数,其它结构跟过程类似,值得注意的是,那么函数就可以在允许有表达式的地方出现(带有输出参数或输入输出参数的函数除外)如:DECLAREmyStr VARCHAR2(30);BEGIN myStr:=currentTime;

函数是一个能够计算结果值的子程序,函数除了有一个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';

Tags:Oracle 子程序 函数

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接