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

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日

相关文章

  • MySQL查看和修改时区的方法

    下面是详细的MySQL查看和修改时区的方法: 查看当前时区 在MySQL客户端,可以通过如下命令查看当前时区: SELECT @@global.time_zone; 查看当前时区的设置,可以通过如下命令: SHOW VARIABLES LIKE ‘%time_zone%’; 输出内容包含了当前时区设置、可用的时区列表,以及系统时间和UTC时间之间的时差(即偏…

    database 2023年5月22日
    00
  • MySql中使用正则表达式查询的方法

    对于”MySql中使用正则表达式查询的方法”,具体步骤如下: 步骤一:使用REGEXP函数进行正则表达式查询 MySQL中可以使用REGEXP函数进行正则表达式查询。该函数接受一个正则表达式作为参数,并返回匹配该表达式的结果。 例如,我们可以使用下面的语句来查询符合正则表达式^test.*的记录: SELECT * FROM table_name WHERE…

    database 2023年5月22日
    00
  • java servlet手机app访问接口(三)高德地图云存储及检索

    Java Servlet 手机 App 访问接口(三):高德地图云存储及检索 本教程将教你如何在你的 Java Servlet 手机 App 中使用高德地图云存储及检索服务。高德地图云提供了诸多方便的 API,能够管理和存储大规模的地图数据,支持高效查询、检索等等。我们将使用这些 API 来实现我们的手机 App。 准备工作 为了使用高德地图云的服务,我们需…

    database 2023年5月22日
    00
  • 关于分布式锁的三种实现方式

    关于分布式锁的三种实现方式,可以分别是: 基于数据库的实现 基于Redis的实现 基于Zookeeper的实现 下面我们将一一进行详细讲解。 基于数据库的实现 基于数据库的实现是通过在数据库中建立一张锁表,并在其中插入一条记录来实现锁的控制。具体步骤如下: 建立数据库锁表。该锁表通常包含以下字段: 锁名(lock_name):用于区分不同的锁。 加锁时间(l…

    database 2023年5月22日
    00
  • MySQL与PHP的基础与应用专题之数据查询语句

    接下来我会详细讲解“MySQL与PHP的基础与应用专题之数据查询语句”的完整攻略,包括基础概念、常用语句和示例说明。 一、基础概念 在介绍数据查询语句之前,我们需要先了解一些常用概念。 1.1 数据库 数据库是指一组按照一定结构、组织、存储和管理的数据集合。通俗点讲,就是计算机中存储数据的仓库。 1.2 数据表 数据表是数据库中的一种结构化数据存储形式,可以…

    database 2023年5月22日
    00
  • Redis分布式Session和普通的cookie session有什么区别?

    Redis 是一种高性能的缓存和 key-value 存储系统,常被用来实现分布式 Session 的方案。在这种方案中,用户的登录信息存储在 Redis 中,而不是存储在本地的 cookie 或 session 中。 当用户在集群中的不同节点之间切换时,通过读取 Redis 中的登录信息,各个节点可以实现登录态的同步。这种方式能够解决传统基于 cookie…

    Redis 2023年4月10日
    00
  • LNMP下使用命令行导出导入MySQL数据库的方法

    当我们在LNMP环境下开发网站时,经常需要将本地开发环境的数据库导出到生产环境中,或者从生产环境中导出数据到本地测试环境中。这时候命令行导出导入MySQL数据库就成为了一个非常方便的方式。 以下是完整攻略: 1. 导出数据库 使用命令行导出MySQL数据库非常方便,首先我们需要确定要导出哪个数据库和导出的路径。打开终端,可以使用以下命令导出。 mysqldu…

    database 2023年5月21日
    00
  • MongoDB数据模型详解

    MongoDB是一种基于文档的非关系型数据库,数据模型也有所不同于传统的关系型数据库。本文将详细介绍MongoDB的数据模型,并通过示例代码进行演示。 文档 MongoDB中的最基本的数据单元是文档(Document),文档是一个以键值对形式组成的数据结构,类似于JSON对象。MongoDB中的文档可以包含嵌套的文档或数组。 下面是一个简单的文档示例: { …

    MongoDB 2023年3月13日
    00
合作推广
合作推广
分享本页
返回顶部