当前位置: 首页 > news >正文

18.Oracle的过程和函数

oracle11g的过程和函数

  • 一、过程(Procedure)
    • 1、子程序
    • 2、过程的相关语法
  • 二、函数(Function)
    • 1、函数的概念
    • 2、函数的创建
    • 3、 案例

在Oracle数据库中,过程和函数都是用来封装一系列SQL语句和逻辑操作的数据库对象,以便在需要时可以重复使用。它们都可以接受参数并返回值,但在使用上有一些区别。
zohanshu

一、过程(Procedure)

  • 过程是一组SQL语句和逻辑操作的集合,它可以接受输入参数,但不一定返回数值。
  • 过程可以执行数据操作、流程控制和业务逻辑,它可以包含事务控制语句,如COMMIT和ROLLBACK。
  • 过程通常用于执行一系列的操作,例如数据处理、数据导入导出等。

1、子程序

  1. 什么是子程序

    命名的 PL/SQL 块,编译并存储在数据库中。

    • 子程序的各个部分:
      • 声明部分
      • 可执行部分
      • 异常处理部分(可选)
    • 子程序的分类:
      • 过程 - 执行某些操作
      • 函数 - 执行操作并返回值
  2. 子程序的优点:

    • 模块化:将程序分解为逻辑模块
    • 可重用性:可以被任意数目的程序调用
    • 可维护性:简化维护操作
    • 安全性:通过设置权限,使数据更安全

2、过程的相关语法

  1. 创建语法

    CREATE OR REPLACE PROCEDURE procedure_name (parameter1 IN datatype1, parameter2 OUT datatype2)
    AS
    BEGIN-- 存储过程的逻辑代码
    END;
    /
    

    在上面的语法中:

    • CREATE OR REPLACE用于创建或替换已存在的存储过程。
    • PROCEDURE关键字用于声明创建一个存储过程。
    • procedure_name是存储过程的名称。
    • parameter1是输入参数,使用IN关键字声明,后面跟着参数的数据类型。
    • parameter2是输出参数,使用OUT关键字声明,后面跟着参数的数据类型。
    • ASBEGIN之间是存储过程的实际逻辑代码。
    • END;表示存储过程的结束。

    下面是一个示例,展示了如何创建一个简单的存储过程:

    CREATE OR REPLACE PROCEDURE get_employee_name (p_employee_id IN NUMBER, p_employee_name OUT VARCHAR2)
    AS
    BEGINSELECT employee_name INTO p_employee_name FROM employees WHERE employee_id = p_employee_id;
    END;
    /
    

    在上面的示例中,我们创建了一个名为get_employee_name的存储过程。它接受一个员工ID作为输入参数,并返回该员工的姓名。在实际使用时,可以通过调用这个存储过程来获取员工的姓名。

  2. 过程参数的三种模式

    在Oracle中,存储过程和函数的参数可以使用以下三种模式进行声明和传递:

  • IN模式:

    • 当参数声明为IN模式时,表示该参数是一个输入参数,即存储过程或函数可以读取该参数的值,但不能修改它。
    • 在调用存储过程或函数时,需要提供IN模式参数的值作为输入。
    • 例如:
      CREATE OR REPLACE PROCEDURE my_procedure (p_input_param IN VARCHAR2) AS
      BEGIN-- 读取p_input_param的值,但不能修改它
      END;
      
  • OUT模式:

    • 当参数声明为OUT模式时,表示该参数是一个输出参数,即存储过程或函数可以修改该参数的值,并且该值将在存储过程或函数执行完毕后返回给调用者。
    • 在调用存储过程或函数时,OUT模式参数通常不需要提供初始值,因为它的值将由存储过程或函数赋予。
    • 例如:
      CREATE OR REPLACE PROCEDURE my_procedure (p_output_param OUT NUMBER) AS
      BEGINp_output_param := 100; -- 修改p_output_param的值
      END;
      
  • IN OUT模式:

    • 当参数声明为IN OUT模式时,表示该参数既是输入参数,又是输出参数,即存储过程或函数可以读取并修改该参数的值,并且该值将在存储过程或函数执行完毕后返回给调用者。
    • 在调用存储过程或函数时,需要提供IN OUT模式参数的初始值作为输入,并且在存储过程或函数执行完毕后,该参数的值将被修改并返回给调用者。
    • 例如:
      CREATE OR REPLACE PROCEDURE my_procedure (p_in_out_param IN OUT VARCHAR2) AS
      BEGINp_in_out_param := p_in_out_param || '_modified'; -- 修改p_in_out_param的值
      END;
      

    通过使用这三种参数模式,可以在存储过程和函数中实现对参数的不同操作和传递方式,从而满足不同的业务需求。

  1. 执行过程的语法
    在Oracle中,执行存储过程的语法如下:

    EXECUTE procedure_name(parameter1, parameter2, ...);
    

    或者可以使用以下语法:

    CALL procedure_name(parameter1, parameter2, ...);
    

    在上面的语法中:

    • EXECUTE或CALL关键字用于执行存储过程。
    • procedure_name是要执行的存储过程的名称。
    • parameter1, parameter2, …是存储过程的参数,如果存储过程有参数的话,需要根据参数的顺序传递参数的值。

    例如,如果有一个名为get_employee_name的存储过程,它接受一个员工ID作为输入参数,并返回员工的姓名作为输出参数,那么可以使用以下语法来执行该存储过程:

    EXECUTE get_employee_name(100, :employee_name);
    

    或者使用CALL语法:

    CALL get_employee_name(100, :employee_name);
    

    在上面的示例中,100是作为输入参数传递给存储过程的员工ID,:employee_name是一个输出参数,用于接收存储过程返回的员工姓名。

    通过使用上述语法,可以执行存储过程并传递参数,从而实现对数据库的操作。

  2. 过程的执行权限授予
    要将存储过程的执行权限授予其他用户,你可以使用Oracle的GRANT语句。以下是授予其他用户执行存储过程权限的示例:

    GRANT EXECUTE ON procedure_name TO other_user;
    

    在上面的示例中:

    • procedure_name是要授予权限的存储过程的名称。
    • other_user是要授予权限的其他用户的名称。

    执行上述GRANT语句后,other_user将获得对procedure_name存储过程的执行权限,允许该用户执行该存储过程。

    如果你希望其他用户能够执行某个schema中的所有存储过程,可以使用以下语法:

    GRANT EXECUTE ON SCHEMA_NAME TO other_user;
    

    在上面的示例中,SCHEMA_NAME是包含存储过程的schema的名称,other_user将获得对该schema中所有存储过程的执行权限。

    请注意,授予执行权限是一种敏感的操作,应该谨慎使用。确保只授予必要的权限,并且只授予给需要执行存储过程的用户。

二、函数(Function)

1、函数的概念

  • 函数也是一组SQL语句和逻辑操作的集合。
  • 函数是可以返回值的命名的 PL/SQL 子程序。
  • 函数通常用于计算和返回一个值,例如在查询中调用函数来进行数学运算、字符串处理或者日期计算。
  • 函数可以被用于SELECT语句的列中,也可以在其他SQL语句中调用。

在Oracle 11g数据库中,过程和函数都可以使用PL/SQL(Procedural Language/Structured Query Language)来编写,PL/SQL是Oracle数据库的过程化扩展语言,它允许开发人员在数据库中编写存储过程、函数、触发器等。

无论是过程还是函数,它们都可以提高数据库的性能和安全性,减少重复编写相同逻辑的工作,同时也可以简化数据库应用程序的开发和维护工作。

2、函数的创建

  1. 创捷语法

    CREATE OR REPLACE FUNCTION function_name (parameter1 IN datatype1) RETURN datatype2
    ASvariable datatype2;
    BEGIN-- 函数的逻辑代码RETURN variable;
    END;
    /
    

    在上面的语法中:

    • CREATE OR REPLACE用于创建或替换已存在的函数。
    • FUNCTION关键字用于声明创建一个函数。
    • function_name是函数的名称。
    • parameter1是输入参数,使用IN关键字声明,后面跟着参数的数据类型。
    • RETURN datatype2用于声明函数的返回类型。
    • AS和BEGIN之间是函数的实际逻辑代码。
    • RETURN variable;用于返回函数的结果。

    下面是一个示例,展示了如何创建一个简单的函数:

    CREATE OR REPLACE FUNCTION calculate_bonus (p_salary IN NUMBER) RETURN NUMBER
    ASv_bonus NUMBER;
    BEGINIF p_salary > 50000 THENv_bonus := p_salary * 0.1;ELSEv_bonus := p_salary * 0.05;END IF;RETURN v_bonus;
    END;
    /
    

    以上代码是一个创建或替换函数的示例。该函数名为calculate_bonus,接受一个输入参数p_salary(工资)并返回一个数值类型的结果,表示奖金金额。
    函数的逻辑如下:

    • 如果输入的工资p_salary大于50000,则奖金金额为工资的10%;
    • 否则,奖金金额为工资的5%。

    在函数体内部,使用了一个局部变量v_bonus来存储计算得到的奖金金额,并使用IF-ELSE条件语句来根据不同的情况进行计算。最后,使用RETURN语句返回计算得到的奖金金额。

    通过使用上述代码,可以在数据库中创建一个名为calculate_bonus的函数,当需要根据工资计算奖金时,可以调用此函数来获得相应的奖金金额。

  2. 函数的限制:

  • 函数的参数类型和数量必须与函数声明中的参数类型和数量匹配。
  • 函数的返回类型必须与函数声明中指定的返回类型匹配。
  • 函数体内部的代码必须遵循数据库管理系统所使用的特定语法和规则。
  • 在函数体内部,可以访问和操作数据库表、视图、其他函数、存储过程等数据库对象,但需要确保有足够的权限来执行这些操作。
  1. 访问函数的两种方式:
  • 直接调用:在SQL语句中可以直接调用函数,例如:

    SELECT calculate_bonus(60000) FROM dual;
    

    这里的calculate_bonus是函数的名称,60000是传递给函数的参数。

  • 作为表达式的一部分:函数可以作为SQL表达式的一部分来使用,例如:

    SELECT employee_name, calculate_bonus(salary) AS bonus FROM employees;
    

    在这个例子中,calculate_bonus函数被用作一个表达式,用来计算每个员工的奖金,并将结果作为一个新的列返回。

    通过这两种方式,可以方便地使用函数来进行计算和数据处理,从而提高数据库查询和操作的灵活性和功能性。

3、 案例

  • 案例题目
    已经执行了下面语句

    create table  分数表 (student_no number(3),name varchar2(10), score number(3));insert into   分数表  values (1,'张一', 56);
    insert into   分数表 values(2,'张二', 82);
    insert into   分数表 values  (3,'张三', 90);
    

    要求:创建一个函数,可以接受用户输入的学号,得到该学生的名次,并输出这个名次。
    要实现这个功能,可以创建一个函数,函数的输入参数是学生的学号,函数的输出是该学生的名次。下面是一个示例函数的定义:

  • 案例解答:

    CREATE OR REPLACE FUNCTION get_student_rank(p_student_no IN NUMBER) RETURN NUMBER
    ASv_rank NUMBER;
    BEGINSELECT COUNT(*) INTO v_rankFROM 分数表WHERE score > (SELECT score FROM 分数表 WHERE student_no = p_student_no);RETURN v_rank + 1; -- 因为排名从1开始,所以需要加1
    END;
    /
    

    在上面的函数中,我们创建了一个名为get_student_rank的函数,它接受一个学号作为输入参数,并返回该学生的名次。函数的逻辑如下:

    • 首先,我们使用一个SELECT语句来计算比指定学生分数更高的学生数量,这个数量就是指定学生的名次。
    • 然后,我们将这个名次返回作为函数的结果。

    使用这个函数,可以通过以下方式获取指定学生的名次:

    SELECT get_student_rank(2) FROM dual;
    

    这将返回学号为2的学生的名次。

以下对过程和函数进行的比较:

特性过程函数
返回值可以有OUT参数来返回值返回单个值
在SQL中的使用不能直接在SQL语句中使用可以直接在SQL语句中使用
错误处理可以使用异常处理来处理错误可以使用异常处理来处理错误
事务处理可以提交或回滚事务不能提交或回滚事务
调用方式可以从其他过程或触发器中调用可以从SQL语句或其他函数中调用
CALL my_procedure(param1, param2);SELECT my_function(param1, param2) FROM dual;

这些是过程和函数之间的一些主要区别。根据特定任务的具体要求,每种方法都有其自己的用例和优势。

相关文章:

18.Oracle的过程和函数

oracle11g的过程和函数 一、过程(Procedure)1、子程序2、过程的相关语法 二、函数(Function)1、函数的概念2、函数的创建3、 案例 在Oracle数据库中,过程和函数都是用来封装一系列SQL语句和逻辑操作的数据库对象&#…...

A JSONObject text must begin with ‘{‘ at 1 [character 2 line 1]

今天调用一个接口,返回的是json数据,但是拿到数据进行转换的报错, JSONObject resultJson new JSONObject(resuStr);报错信息是: Exception in thread "main" org.json.JSONException: A JSONObject text must begin …...

C#中openFileDialog控件的使用方法

目录 一、OpenFileDialog基本属性 二、使用 OpenFile 从筛选的选择中打开文件 1.示例源码 2.生成效果 3. 其它示例 三、使用 StreamReader 以流的形式读取文件 1.示例源码 2.生成效果 四、一种新颖的Windows窗体应用文件设计方法 在C#中,OpenFileDialog控件…...

多线程04 死锁,线程可见性

前言 前面我们讲到了简单的线程安全问题以及简单的解决策略 其根本原因是cpu底层对线程的抢占式调度策略,随机调度 其他还有一些场景的问题如下 1.多个线程同时修改一个变量问题 2.执行的操作指令本身不是原子的 比如自增操作就分为三步,加载,自增,保存 3.内存可见性问题 4.指令…...

java中文转拼音(去除音调)

一、jar包 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency> 二、代码 /*** 中文转换拼音*/ public class PinyinConvert {/**** param str 钱多多* r…...

[Android]常见的数据传递方式

Demo:https://github.com/Gamin-fzym/DataTransferDemo 1.Intent 发送页面 A 到页面 B 的 Intent 时&#xff0c;可以通过 Intent 的 putExtra() 方法将数据附加到 Intent 上。 在页面 B 中&#xff0c;通过 Intent 的 getXXXExtra() 方法获取传递的数据。 1).在A页面发送 …...

<蓝桥杯软件赛>零基础备赛20周--第7周--栈和二叉树

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…...

探究Kafka原理-7.exactly once semantics 和 性能测试

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…...

【密码学引论】序列密码

第五章 序列密码 1、序列密码 定义&#xff1a; 加密过程&#xff1a;把明文与密钥序列进行异或运算得到密文解密过程&#xff1a;把密文与密钥序列进行异或运算得到明文以字/字节为单位加解密密钥&#xff1a;采用一个比特流发生器随机产生二进制比特流 2、序列密码和分组密…...

知识变现的未来:解析知识付费系统的核心

随着数字时代的发展&#xff0c;知识付费系统作为一种新兴的学习和知识分享模式&#xff0c;正逐渐引领着知识变现的未来。本文将深入解析知识付费系统的核心技术&#xff0c;揭示其在知识经济时代的重要性和潜力。 1. 知识付费系统的基本架构 知识付费系统的核心在于其灵活…...

【Linux基础】Linux常见指令总结及周边小知识

前言 Linux系统编程的学习我们将要开始了&#xff0c;学习它我们不得不谈谈它的版本发布是怎样的&#xff0c;谈它的版本发布就不得不说说unix。下面是unix发展史是我在百度百科了解的 Unix发展史 UNIX系统是一个分时系统。最早的UNIX系统于1970年问世。此前&#xff0c;只有…...

【Android知识笔记】性能优化专题(五)

App瘦身优化 随着业务迭代,apk体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。 瘦身优势: 最主要是转换率:下载转换率头部 App 都有 Lite 版渠道合作商要求了解 …...

Java基础之泛型

Java基础之泛型 一、泛型应用范围二、使用泛型方法三、泛型类 一、泛型应用范围 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许程序员在编译时检测到非法的类型。 使用 Java 泛型的概念&#xff0c;我们可以写一个泛型方法来对一个对象数组排序。然后&#xff0c;调…...

WPF实战项目十五(客户端):RestSharp的使用

1、在WPF项目中添加Nuget包&#xff0c;搜索RestSharp安装 2、新建Service文件夹&#xff0c;新建基础通用请求类BaseRequest.cs public class BaseRequest{public Method Method { get; set; }public string Route { get; set; }public string ContenType { get; set; } &quo…...

C语言基础篇5:指针(二)

接上篇&#xff1a;C语言基础篇5&#xff1a;指针(一) 4 指针作为函数参数 4.1 指针变量作为函数的参数 指针型变量可以作为函数的参数&#xff0c;使用指针作为函数的参数是将函数的参数声明为一个指针&#xff0c;前面提到当数组作为函数的实参时&#xff0c;值传递数组的地址…...

「Verilog学习笔记」非整数倍数据位宽转换8to12

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 要实现8bit数据至12bit数据的位宽转换&#xff0c;必须要用寄存器将先到达的数据进行缓存。8bit数据至12bit数据&#xff0c;相当于1.5个输入数据拼接成一个输出数据&#…...

Qt_一个由单例引发的崩溃

Qt_一个由单例引发的崩溃 文章目录 Qt_一个由单例引发的崩溃摘要关于 Q_GLOBAL_STATIC代码测试布局管理器源码分析Demo 验证关于布局管理器析构Qt 类声明周期探索更新代码获取父类分析Qt 单例宏源码 关键字&#xff1a; Qt、 Q_GLOBAL_STATIC、 单例、 UI、 崩溃 摘要 今…...

P8A004-系统加固-磁盘访问权限

【预备知识】 访问权限&#xff0c;根据在各种预定义的组中用户的身份标识及其成员身份来限制访问某些信息项或某些控制的机制。访问控制通常由系统管理员用来控制用户访问网络资源&#xff08;如服务器、目录和文件&#xff09;的访问&#xff0c;并且通常通过向用户和组授予…...

数智赋能 锦江汽车携手苏州金龙打造高质量盛会服务

作为一家老牌客运公司&#xff0c;成立于1956年的上海锦江汽车服务有限公司&#xff08;以下简称锦江汽车&#xff09;&#xff0c;拥有1200多辆大巴和5000多辆轿车&#xff0c;是上海乃至长三角地区规模最大的专业旅游客运公司。面对客运市场的持续萎缩&#xff0c;锦江汽车坚…...

kolla-ansible 部署OpenStack云计算平台

目录 一、环境 二、安装及部署 三、测试 一、环境 官方文档&#xff1a;https://docs.openstack.org/kolla-ansible/yoga/user/quickstart.html rhel8.6 网络设置&#xff1a; 修改网卡名称 网络IP&#xff1a; 主机名&#xff1a; 网络时间协议 配置软件仓库 vim docke…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...