oracle中 procedure(存储过程)和function(函数)本质区别

yizhihongxing

Oracle 中 Procedure 和 Function 本质区别

在 Oracle 数据库中,Procedure 和 Function 都是存储过程的一种。但是它们有各自独特的特点和用途,下面详细讲解二者本质上的区别。

Procedure

1. 定义

Procedure 是一种存储程序,它是一组 SQL 语句和控制结构。它没有返回值,只负责完成一些操作,包括增删改查等操作。它是一种应用程序,可以接收参数和变量来执行相应的命令。

下面是一个求和 Procedure 的示例:

CREATE OR REPLACE PROCEDURE cal_sum(a IN NUMBER, b IN NUMBER, c OUT NUMBER)
IS
BEGIN
  c := a + b; -- 计算 a+b 的和,并将结果赋值给 c
END;
/

上面的示例是一个传入两个数 a 和 b,然后执行相应的求和操作,结果放在 c 中的 Procedure。

2. Procedure 的特点

  • Procedure 没有返回值,只具有完成一些特定操作的功能。
  • Procedure 可以有多个 IN 或 OUT 参数,也可以没有参数。
  • Procedure 可以调用其他 Procedure,还可以自动提交事务。
  • Procedure 可以包含流程控制语句(如 IF、LOOP、WHILE)和异常处理语句(如 EXCEPTION)等。

Function

1. 定义

Function 是一种存储程序,它也是一组 SQL 语句和控制结构。与 Procedure 不同的是,Function 是有返回值的,可以返回单个值或多个值。一般情况下,Function 用于查询或处理数据,并返回一个具体的结果。

下面是一个根据学生的成绩返回等级的 Function 的示例:

CREATE OR REPLACE FUNCTION get_grade(score IN NUMBER) RETURN VARCHAR2
IS
  grade VARCHAR2(20);
BEGIN
  IF score BETWEEN 90 AND 100 THEN
    grade := 'A';
  ELSIF score BETWEEN 80 AND 89 THEN
    grade := 'B';
  ELSIF score BETWEEN 70 AND 79 THEN
    grade := 'C';
  ELSIF score BETWEEN 60 AND 69 THEN
    grade := 'D';
  ELSE
    grade := 'F';
  END IF;

  RETURN grade; -- 返回值为等级
END;
/

上面的示例是一个传入一个学生成绩,然后返回相应等级的 Function。

2. Function 的特点

  • Function 具有返回值,返回单个值或多个值。
  • Function 可以有零个或多个 IN 参数和一个 OUT 或 RETURN 参数。
  • Function 不可以调用其他 Function,也不能进行自动提交事务。
  • Function 中不能包含 DDL 语句(如 CREATE、DROP、ALTER)等。

二者区别

  • Procedure 通常用于处理事务和 DML 操作,没有返回值,一般情况下需要使用 OUT 参数返回结果。
  • Function 通常用于查询或处理数据,有返回值,可以组合成表达式进行使用。
  • Procedure 不能包含 RETURN 语句返回结果,而 Function 必须包含 RETURN 语句返回结果。
  • Procedure 和 Function 可以共享相同的变量,但是 Procedure 中对变量的改变不会影响 Function 的操作,Function 中对变量的改变也不会影响 Procedure 的操作。

示例说明

  • 示例一:使用 Procedure 实现向库存表增加商品数量的操作
CREATE OR REPLACE PROCEDURE add_product_qty(p_id IN NUMBER, p_qty IN NUMBER)
IS
BEGIN
  UPDATE stock
  SET qty = qty + p_qty
  WHERE product_id = p_id;
END;
/

对于上述示例来说,采用 Procedure 的方式可以有效地实现对库存表的增加数量操作,不需要返回其它结果,且需要对同一库存表多次操作时可以复用该 Procedure。

  • 示例二:使用 Function 实现聚合运算
CREATE OR REPLACE FUNCTION get_dept_avg_salary(dept_name IN VARCHAR2)
RETURN NUMBER
IS
  dept_avg_salary NUMBER;
BEGIN
  SELECT AVG(salary) INTO dept_avg_salary FROM employees WHERE department_name = dept_name;

  RETURN dept_avg_salary;
END;
/

上述示例使用 Function 的方式实现了根据部门名称进行平均薪资的统计,并返回该部门的平均薪资值。采用该函数的方式可以实现简单的聚合运算,且可以方便地进行组合使用,例如将该 Function 与查找最高薪资的 Function 进行组合,实现各种复杂的查询操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:oracle中 procedure(存储过程)和function(函数)本质区别 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Linux怎么添加mysql系统环境变量

    这篇文章主要讲解了“Linux怎么添加mysql系统环境变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux怎么添加mysql系统环境变量”吧! Linux添加mysql系统环境变量 昨天安装完mysql后,直接在export PATH上面一行,增加了export PATH=/usr/local/my…

    MySQL 2023年4月8日
    00
  • MySQL三表联合查询操作举例

    下面是关于MySQL三表联合查询的完整攻略。 什么是三表联合查询 当需要从多个表中检索数据时,可以使用多表联合查询,其中三张表的联合查询被称为三表联合查询。它可以有效地将多个表中的相关数据连接、筛选和展示。 举个例子,比如我们有三个数据表: 表1-员工信息表|字段名|数据类型|说明||—|—|—||id|int|员工编号||name|varcha…

    database 2023年5月22日
    00
  • Docker容器使用宿主机上的mongod/redis等服务详解

    下面我将详细讲解“Docker容器使用宿主机上的mongod/redis等服务”的完整攻略。 1. 使用桥接网络和host网络 Docker容器可以使用宿主机上的服务,有两种方式可以实现:使用桥接网络和使用host网络。 1.1 使用桥接网络 Docker默认会为每一个容器创建一个自己的网络。如果在容器内需要访问宿主机上的服务,可以通过将容器加入到宿主机上的…

    database 2023年5月22日
    00
  • SQL面试题:求时间差之和(有重复不计)

    SQL面试题:求时间差之和(有重复不计)是一个常见的面试题目,下面我们将讲解如何解决这个问题。 问题描述 我们给定了一张表,表中有两个字段start_time和end_time,这两个字段均为时间类型,我们需要求出两个时间字段的差并将它们的和作为结果返回,如果有重复的记录,则只计算一次。 解题思路 我们可以通过两个方法来解决这个问题。一是使用子查询,二是使用…

    database 2023年5月21日
    00
  • SQL Server中的数据类型详解

    关于“SQL Server中的数据类型详解”的完整攻略,我可以给你详细讲解。在SQL Server中,数据类型用于定义表中的列所使用的数据的类型。常见的数据类型包括文本、数字、日期和时间、二进制和空值。 SQL Server中常见的数据类型有以下几种: 数值类型(Numeric Data Types) 数值类型主要用于存放数值,包括整数、小数和货币等。以下是…

    database 2023年5月21日
    00
  • Navicat连接MySQL8.0的正确方法(亲测有效)

    下面是“Navicat连接MySQL8.0的正确方法(亲测有效)”的完整攻略: 导入MySQL8.0 JDBC驱动 在Navicat中连接MySQL8.0数据库之前,需要先导入MySQL8.0的JDBC驱动。操作步骤如下: 下载MySQL8.0的JDBC驱动(下载地址:https://dev.mysql.com/downloads/connector/j/)…

    database 2023年5月18日
    00
  • Redis key键使用方法详解(创建、修改、删除、查询)

    Redis是一个基于键值存储的数据结构服务器,其中的key键被用来唯一标识一个Value值。这个键可以是一个简单的字符串,也可以是一个复杂的数据结构。 学习如何使用Redis key键,是每个Redis开发者首先要了解的。本文将介绍Redis中的键操作,包括创建、修改、删除和查询。 创建一个键 Redis中的键是按照一定规则创建的,遵循特定的语法。下面是创建…

    Redis 2023年3月18日
    00
  • SQL中Truncate的用法

    当需要清空表并且重置自动递增ID时,我们可以使用SQL中的Truncate命令。Truncate与DELETE操作非常相似,但是具有更高的效率。因为它不会记录删除行的操作日志,并且仅将表截断到指定的位置,因此它会更快地执行表清空操作。 语法 TRUNCATE TABLE table_name; 在这个语法中,table_name是要清空的表名。 示例 1 如…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部