Oracle 自定义函数

语法结构

CREATE [OR REPLACE] FUNCTION '定义的函数名称'('参数名1' '参数类型','参数名2' '参数类型', ...) RETURN '返回值类型'
AS/IS
返回值形参 形参类型实例化
BEGIN
方法体
(其中用到if判断的话,每一个if对应一个end if,出现几次if就会有几个end if;)
RETURN (接收过实参的)返回值形参
[EXCEPTION '异常处理部分']
END;

以SCOTT账户中的emp和dept两张表为例:

EMP表:

DEPT表:

例一:统计薪资大于等于3000的员工人数。

要求输出格式:人数为1时,输出'有一位员工薪资大于3000';不止1人时,输出'有...位员工薪资大于3000';一个也没有就输出'没有员工薪资大于3000'。

create or replace function empSal return varchar2
as
    result varchar2(32);
    temp number;
        begin
            select count(sal) count into temp from SCOTT.emp e where e.sal>=3000;
            if temp=1 then
                result:='有一位员工薪资大于3000';
                else if temp>1 then
                    result:='有'||temp||'位员工薪资大于3000';
                    else result:='没有员工薪资大于3000';
                end if;
            end if;
            return result;
        end;
    select empSal() from dual;

查询结果: 

例二:自定义代参函数,参数为部门名称,统计输入部门员工人数。

create or replace function depA2(dep varchar2) return number
as
    result number;
        begin
select t.count into result from (select count(e.deptno) count from SCOTT.dept d left join SCOTT.emp e on d.deptno=e.deptno where d.dname=dep) t;
            return result;
        end;
    select depA2('SALES') from dual;

查询结果:

例三:自定义代参函数,参数为部门名称,统计输入部门薪资大于等于3000的员工人数。

要求输出格式:人数为1时,输出'有一位员工薪资大于3000';不止1人时,输出'有...位员工薪资大于3000';一个也没有就输出'没有员工薪资大于3000'。

create or replace function highSaleAmount(dept varchar2) return varchar2
as
    result varchar2(64);
    temp number;
    amount number;
        begin
        select count(dname) into temp from SCOTT.dept d where d.dname in(dept);
        select count(sal) into amount from scott.emp e left join SCOTT.dept d on d.deptno=e.deptno where d.dname=dept and sal>=3000;
        if temp!=0 then
            if amount=1 then result:='该部门有一位员工薪资大于3000';
            else if amount>1 then result:='有'||amount||'位员工薪资大于3000';
            else result:='该部门没有人薪资大于3000';
        end if;
        end if;
            else
        result:='没有这个部门';
        end if;
            return result;
        end;
    select highSaleAmount('ACCOUNTING') from dual;

查询结果:

### Oracle 数据库自定义函数的创建与使用 在 Oracle 数据库中,自定义函数是一种非常强大的工具,可以用来封装逻辑、提高代码复用性以及解决跨数据库兼容性问题。以下是关于如何创建和使用自定义函数的详细说明。 #### 创建存储函数 创建存储函数的基本语法如下: ```sql CREATE [OR REPLACE] FUNCTION 函数名 (参数列表) RETURN 函数值类型 AS -- 定义局部变量 BEGIN -- 函数体逻辑 RETURN 返回值; END; ``` - `CREATE OR REPLACE`:如果函数已经存在,则替换它。 - 参数列表:可以包含零个或多个参数,每个参数都有名称、模式(IN、OUT 或 IN OUT)和数据类型。 - `RETURN`:指定函数返回的数据类型。 #### 示例 1:无参函数 以下是一个简单的无参函数示例,用于返回当前日期[^3]: ```sql CREATE OR REPLACE FUNCTION get_current_date RETURN DATE AS BEGIN RETURN SYSDATE; END; ``` 调用该函数的方式如下: ```sql SELECT get_current_date FROM DUAL; ``` #### 示例 2:带参函数 以下是一个带参函数示例,用于统计某个部门的员工人数[^4]: ```sql CREATE OR REPLACE FUNCTION depA2(dep VARCHAR2) RETURN NUMBER AS result NUMBER; BEGIN SELECT COUNT(e.deptno) INTO result FROM SCOTT.dept d LEFT JOIN SCOTT.emp e ON d.deptno = e.deptno WHERE d.dname = dep; RETURN result; END; ``` 调用该函数时,可以传递部门名称作为参数: ```sql SELECT depA2('SALES') FROM DUAL; ``` #### 示例 3:外部函数 Oracle 支持通过外部函数调用 C/C++ 编写的动态链接库。例如,假设有一个名为 `mylib.so` 的动态链接库,其中包含一个函数 `add_numbers`,可以通过以下方式注册并调用它[^2]: ```sql CREATE LIBRARY mylib AS '/path/to/mylib.so'; CREATE OR REPLACE FUNCTION add_numbers(a NUMBER, b NUMBER) RETURN NUMBER AS EXTERNAL NAME 'add_numbers' LIBRARY mylib LANGUAGE C PARAMETERS (a BY VALUE, b BY VALUE); ``` 调用此函数的方式如下: ```sql SELECT add_numbers(5, 3) FROM DUAL; ``` #### 注意事项 - 自定义函数必须包含 `RETURN` 子句,用于返回函数值[^3]。 - 如果函数需要处理复杂逻辑,可以结合 PL/SQL 块实现。 - 在编写函数时,应考虑性能优化,避免不必要的查询或循环操作。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值