Oracle函数

本文介绍如何在SQL中创建函数,包括无参函数和带参函数的创建方法,并对比了存储过程与函数的区别,阐述了它们的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建函数的语法格式

CREATE [OR REPLACE] FUNCTION [schema.]function_name
[ ( argument[IN] datatype…,)]
RETURN datatype  
{IS | AS}
[description part 说明部分]
BEGIN
 SQL STATEMENT 语句序列
 RETURN (表达式)
[EXCEPTION 例外处理]
END [function_name 函数名];

说明:

  • 参数列表是可选的,且只允许有输入参数。
  • 函数的返回类型是必需的。并且表达式要返回的数值类型应与函数定义的RETURN子句中指定的类型相同。
  • 在一个函数中,可以使用多个RETURN语句,但是只有一个RENTURN语句被执行(返回值只有一个)。

函数使用的场合

函数可以使用在任何表达式中,可以用在以下场合:
(1)SELECT子句。
(2)WHERE子句。
(3)INSERT语句中的VALUES。
(4)UPDATE的SET子句。

2.创建不带参的函数

例1:创建一个不带参数的标量函数,用于查询orderdetails表中最高订购数量.

CREATE OR REPLACE FUNCTION MaxQuantity  
RETURN orderdetails.quantity%type  
IS
V_maxquantity orderdetails.quantity%type;
BEGIN
    SELECT max(quantity) INTO V_maxquantity
    FROM orderdetails ;
RETURN V_maxquantity;
EXCEPTION  
  WHEN NO_DATA_FOUND THEN    RETURN 0;
  WHEN OTHERS THEN   RETURN  -1;
END;
对无参函数的调用方法:
DECLARE
   v_maxquant number;
BEGIN
    SELECT MaxQuantity INTO v_maxquant
     FROM DUAL;
     IF  v_maxquant=0 THEN
          dbms_output.put_line(‘没有任何订购的产品’);
     ELSIF    v_maxquant=-1 THEN
         dbms_output.put_line(‘发生其他错误’);
      ELSE
     dbms_output.put_line(‘最高销售量为’|| v_maxquant);
   END IF;
END;

3.创建带参的函数

例2:创建一个带参数的标量函数,用于查询orderdetails表中某产品的订购总数量。

CREATE OR REPLACE FUNCTION T_Quantity(prodid number)  
RETURN orderdetails.quantity%type  
IS
V_quantity orderdetails.quantity%type;
BEGIN
    SELECT sum(quantity) INTO V_quantity
    FROM orderdetails WHERE productid=prodid
    Group by productid;
RETURN V_quantity;
EXCEPTION  
  WHEN NO_DATA_FOUND THEN    RETURN 0;
  WHEN OTHERS THEN   RETURN  -1;
END;

对以上定义的带参函数进行调用,并查询出产品编号为10号的产品的编号、名称 、类别、总销量

DECLARE
 pid number;
 cid number;
 pname varchar2(40);
 total_quant number;
BEGIN
  SELECT productid,productname,categoryid, T_Quantity(10)
  INTO pid,pname,cid,total_quant   
  FROM products
  WHERE productid=10;
   IF  total_quant=0 THEN
     dbms_output.put_line(‘没有任何订购的产品’);
ELSIF    total_quant=-1 THEN
      dbms_output.put_line(‘发生其他错误’);
 ELSE
    dbms_output.put_line(‘产品编号为:'|| pid ||  ‘    产品类型为:‘ || cid || ‘    产品名为:‘ || pname || ‘  产品销售总量为:’ || total_quant);
 END IF;
END;

4.存储过程与函数的区别

1、参数形式及返回值不同

  • 函数有零个或多个参数,并且只有一个返回值;过程有零个或多个参数,其返回值是靠OUT参数带出来的,可传出多个值。
  • 过程和函数都可以有IN参数,通过参数列表接受参数的输入。
  • 函数不能有OUT参数,函数值的返回是靠RETURN子句返回的;过程可以由零个或多个OUT参数返回结果。

2、调用形式不同

  • 过程可以作为单独可执行语句一样被调用,可以在PL/SQL块中单独出现。
  •  函数可以在任何表达式能够出现的地方被调用。

5.存储过程和函数的优点

1)提高数据的安全性和完整性
      利用安全性的权限来控制那些没有足够权限的用户对数据库的间接访问;
      通过把相关联的表的操作集中到一起,来保证针对这些相关表执行一致的操作或任何操作都不做;
(2)改善操作性能
     多个用户使用同一个SQL语句时,只做依次语法分析。只在编译时进行语法分析,运行时不再重做,直接调用编译编码。
(3)节省存储空间
     多个不同应用,有同一个存储代码维护性高
(4)模块化

### Oracle 数据库函数使用说明与示例 #### 1. 基础概念 Oracle 函数是一种 PL/SQL 块,能够执行特定的计算或操作并返回值。可以通过 `CREATE OR REPLACE FUNCTION` 创建自定义函数,并通过 SQL 或 PL/SQL 进行调用[^4]。 #### 2. 字符串处理函数 字符串处理函数在数据清洗和格式化中非常常见。以下是几个常用的字符串处理函数及其示例: - **REPLACE** 将指定子字符串替换为另一个字符串。如果未找到匹配项,则返回原始字符串。 ```sql SELECT REPLACE('Hello, World!', 'World', 'Oracle') AS result FROM dual; -- 输出: Hello, Oracle! ``` - **SUBSTR** 提取字符串的一部分,基于起始位置和长度。 ```sql SELECT SUBSTR('Hello, Oracle!', 8, 7) AS result FROM dual; -- 输出: Oracle! ``` - **INSTR** 返回子字符串首次出现的位置。如果没有找到子字符串,则返回 0。 ```sql SELECT INSTR('Hello, Oracle!', 'Oracle') AS position FROM dual; -- 输出: 8 ``` #### 3. 数学运算函数 数学函数用于数值计算,支持四舍五入、绝对值等操作。 - **ROUND** 对数字进行四舍五入到指定位数。 ```sql SELECT ROUND(123.456, 2) AS rounded_value FROM dual; -- 输出: 123.46 ``` - **ABS** 计算给定数字的绝对值。 ```sql SELECT ABS(-123.456) AS absolute_value FROM dual; -- 输出: 123.456 ``` #### 4. 聚合函数 聚合函数用于对一组记录进行统计分析。 - **AVG** 计算某一列的平均值。 ```sql SELECT AVG(salary) AS average_salary FROM employees; ``` - **COUNT** 统计满足条件的行数。 ```sql SELECT COUNT(*) AS total_employees FROM employees WHERE department_id = 10; ``` - **SUM** 计算某一列的总和。 ```sql SELECT SUM(salary) AS total_salary FROM employees; ``` #### 5. 自定义函数示例 创建一个简单的自定义函数来计算两个整数之和: ```sql CREATE OR REPLACE FUNCTION add_numbers (num1 NUMBER, num2 NUMBER) RETURN NUMBER IS result NUMBER; BEGIN result := num1 + num2; RETURN result; END; / SELECT add_numbers(10, 20) AS sum_result FROM dual; -- 输出: 30 ``` #### 6. 错误处理注意事项 在使用聚合函数时需要注意分组规则。例如,在 `GROUP BY` 子句中使用的列必须显式声明,或者作为聚合函数的结果存在[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值