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关于ERROR 1290 (HY000)报错解决方法

    下面就是详细的MySQL关于ERROR 1290 (HY000)报错解决方法攻略: 1. 问题描述 当用户在使用MySQL时,有时会出现ERROR 1290 (HY000)的报错,此时用户无法继续使用MySQL,其常见的错误信息如下: ERROR 1290 (HY000): The MySQL server is running with the –ski…

    database 2023年5月18日
    00
  • CentOS 7.0编译安装lnmp教程(Nginx1.6.0+MySQL5.6.19+PHP5.5.14)

    CentOS 7.0编译安装lnmp教程(Nginx1.6.0+MySQL5.6.19+PHP5.5.14) 简介 本文旨在介绍如何在CentOS 7.0系统下编译安装lnmp,其中包括Nginx1.6.0、MySQL5.6.19和PHP5.5.14三个组件的安装过程。 准备工作 在开始之前,需要准备以下工作: 一台运行CentOS 7.0的服务器 管理员权…

    database 2023年5月22日
    00
  • 详解mysql中的存储引擎

    详解MySQL中的存储引擎 MySQL是当前最流行的数据库之一,它的存储引擎是MySQL的核心组成部分之一。下面,我们将详细讲解MySQL中的存储引擎。 什么是存储引擎? 存储引擎是MySQL中的一种存储数据的方式。在MySQL中,有多个存储引擎供用户选择,每种存储引擎有其特点和适用场景。MySQL支持的存储引擎包括MyISAM、InnoDB、Memory、…

    database 2023年5月21日
    00
  • SQL查询超时的设置方法(关于timeout的处理)

    当我们在使用SQL查询时,如果数据量过大或者查询语句过于复杂,就很容易出现查询超时的问题。在这种情况下,我们需要对SQL查询的timeout进行设置。以下是关于SQL查询超时的设置方法的完整攻略。 1. 设置连接字符串的超时时间 在使用SQL Server连接字符串时,我们可以通过在连接字符串中设置超时时间来控制查询的超时时间。具体设置方法如下: // 在连…

    database 2023年5月22日
    00
  • shell脚本实现mysql数据库双机定时备份的方法

    下面是详细讲解如何使用shell脚本实现MySQL数据库双机定时备份的方法的完整攻略。 1. 安装mysql-client软件包 在备份机器上,需要安装mysql-client软件包来连接MySQL主机并执行备份操作。可以使用以下命令在Ubuntu/Debian上安装: sudo apt-get update sudo apt-get install mys…

    database 2023年5月22日
    00
  • 使用Jedis操作Redis-使用Java语言在客户端操作—对Sorted-Sets的操作

        1 //对Sorted-Sets操作 2 /** 3 * Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。 4 * 它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。 5 * 然而需要额外指出…

    Redis 2023年4月12日
    00
  • 主键和外键的区别

    当设计数据库时,主键和外键是两个重要的概念。主键和外键都是用来建立表与表之间联系的,但是二者有着不同的作用。 什么是主键? 主键是一种用于唯一标识一条数据的字段或者字段组。在一个表中,每一条数据的主键值都是唯一的,通过主键可以快速地找到表中的一条记录,还可以通过主键对表中的数据进行操作。 主键有以下几个特点: 主键不能重复,也就是说主键值必须唯一。 非空,主…

    database 2023年3月27日
    00
  • 小白的springboot之路(三)、集成mybatis与MySQL

    0、前言   mybatis属于半自动的ORM,相比hibernate这种全自动的ORM,兼顾了性能与易用;目前企业项目中,基本都是mybatis的天下;今天就来整合mybatis与MySQL; 1、整合   1.-1、添加依赖: <!– 集成mybatis –> <dependency> <groupId>org.m…

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