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

PLSQL: 存储过程,用户自定义函数[oracle]

注意: raise notice是高斯的输出语句; DBMS_OUT_PUT.PUT_LINE是oracle的输出语句 

存储过程 Stored Procedure

存储过程可以封装数据访问逻辑,使得应用程序可以通过调用存储过程来执行这些逻辑,而不是直接执行SQL语句。这有助于提高代码的可重用性、可维护性和安全性

命名规范

使用下划线分隔单词

使用前缀 sp_或 p_等

可读性: 使用有意义的名称

语法: 创建存储过程

CREATE OR REPLACE PROCEDURE procedure_name [pramaters]
IS/AS  -- 变量声明
BEGIN-- 存储过程的主体-- 可以包含SQL语句和PL/SQL代码
exception--异常处理
END procedure_name;

CREATE OR REPLACE:创建或者替换,当存储过程修改的时候,编译后会覆盖掉原来的同名的存储过程

参数:

 参数类型不需要写长度,参数名不要和存储过程当中定义的变量重名
IN:从外边(调用存储过程的地方)把值传到存储过程内部,默认的参数类型
    [in] 参数名 参数类型
    命名规范:p_(或者i_)开头
    在存储过程中,对 IN 类型参数的值进行修改,新修改的值 只在存储过程内部有效
OUT:把存储过程当中计算(获取)到的值传到外边(调用存储过程的地方)
    OUT 参数名 参数类型 
    命名规范:o_ 开头
INOUT:可以通过 INOUT 参数把 值传到 存储过程中,也可以把值从存储过程传出来,不常使用
    INOUT 参数名 参数类型 

-- 存储过程在创建的时候,只是编译,不会执行,调用存储过程的时候才会执行
-- 调用存储过程,从数据库中将存储过程调用出来,并且会执行里面的代码


-- 无参存储过程

-- 案例1:编写存储过程,获取员工编号为7788的员工的姓名和工资,并打印出来

CREATE OR REPLACE PROCEDURE sp_output_emp 
IS 
DECLAREv_ename emp.ename%TYPE;v_sal emp.sal%TYPE;
BEGINSELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno=7788;RAISE NOTICE '7788的姓名是:%,工资是:%', v_ename, v_sal;
EXCEPTIONWHEN OTHERS THENRAISE NOTICE '发生异常!';RAISE NOTICE '异常代码:%', SQLSTATE;RAISE NOTICE '异常信息:%', SQLERRM;
END;

 -- 简单调用
CALL sp_output_emp();        -- 调用存储过程的名字( );
CALL sp_output_emp1(5566);

有参存储过程(in)

-- 案例2:对案例1进行修改,增加传入参数,查询指定传入员工编号的员工姓名和工资,并打印

CREATE OR REPLACE PROCEDURE sp_output_emp1 (i_empno int) 
IS 
DECLAREv_ename emp.ename%TYPE;v_sal emp.sal%TYPE;
BEGINSELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno=i_empno;RAISE NOTICE '7788的姓名是:%,工资是:%', v_ename, v_sal;
EXCEPTIONWHEN OTHERS THENRAISE NOTICE '发生异常!';RAISE NOTICE '异常代码:%', SQLSTATE;RAISE NOTICE '异常信息:%', SQLERRM;
END;

调用存储参数: 如上和无参调用完全想同

有参存储过程(in 和 out)

例3:在案例2的基础上继续进行修改,增加传出参数,将查询出来的员工姓名和工资,向外传递

CREATE OR REPLACE PROCEDURE sp_output_emp2(IN i_empno int,OUT o_ename emp.ename%TYPE,
OUT o_sal emp.sal%type) 
IS 
DECLAREv_ename emp.ename%TYPE;v_sal emp.sal%TYPE;
BEGINSELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno=i_empno;o_sal := v_sal;o_ename := v_ename;i_empno := 99666;--RAISE NOTICE '7788的姓名是:%,工资是:%', v_ename, v_sal;
EXCEPTIONWHEN OTHERS THENRAISE NOTICE '发生异常!';RAISE NOTICE '异常代码:%', SQLSTATE;RAISE NOTICE '异常信息:%', SQLERRM;
END;

使用匿名块调用存储过程时需要输出语句的原因在于,存储过程的输出参数(OUT参数)不会自动显示其值,它们是“静默”的,即不会像函数返回值那样直接返回。因此,为了查看存储过程的执行结果,需要在调用存储过程的匿名块中使用输出语句来显示这些值。

如果 RAISE NOTICE '7788的姓名是:%, 工资是:%', v_ename, v_sal; 没有被注释掉,那么在使用匿名块调用存储过程时,不需要额外的输出语句来显示这些信息。因为 RAISE NOTICE 语句会直接将信息输出到数据库的日志或控制台。

有参存储过程(in out)

CREATE OR REPLACE PROCEDURE update_value (in out  p_value NUMBER
) AS
BEGIN-- 对传入的值进行操作,例如增加10p_value := p_value + 10;
END;
/

调用存储过程

输出: 10

输出: 15

注意: raise notice是高斯的输出语句; DBMS_OUT_PUT.PUT_LINE是oracle的输出语句

有参存储过程(out) 

函数function

函数的分类

用户自定义函数

它允许用户根据需要定义新的操作和计算, 通常使用PL/SQL编写,可以用于执行各种任务 

语法

CREATE OR REPLACE FUNCTION function_name (parameter_list)
RETURN return_datatype
IS/AS-- 变量声明
BEGIN-- 函数体RETURN return_value;
EXCEPTIONWHEN OTHERS THEN--异常处理
END;

parameter_list 的格式 : 参数类型  参数1  数据类型; 参数类型  参数2   数据类型...... 

注意: oracle中自定义函数不需要declare

  • function_name:函数的名称,由用户自定义。常用函数名前缀: fun_

  • parameter_list:函数的参数列表,参数可以有INOUTIN OUT等模式。一般只用 in, 默认in

  • return_datatype:函数返回值的数据类型。

  • IS/AS:开始函数体的关键字。

  • BEGIN ... END:函数的主体,包含执行的PL/SQL代码。

返回值

函数通过RETURN语句返回一个值。如果函数声明为返回某个数据类型,那么必须通过RETURN语句返回相应类型的值。

调用方式

自定义函数和存储过程的区别

1.自定义函数性能较差, 使用场景比存储过程少

2.自定义函数必须有返回值,存储过程没有,存储过程通过out参数向外传递数据

3.自定义函数的参数一般只使用in类型, 不使用out类型

4.自定义函数可以用一个值调用, 存储过程不可以

5.自定义函数在return处结束

6.自定义函数可以在sql中调用, 存储过程不可以

示例: 根据员工编号 获取姓名

CREATE OR REPLACE FUNCTION fun_get_ename(p_empno emp.empno%type)
RETURN varchar2
AS
v_ename varchar(30); --员工姓名
BEGINSELECT ename INTO v_ename FROM emp WHERE empno=p_empno;RAISE NOTICE 'v_ename:%', v_ename;RETURN v_ename; 
EXCEPTIONWHEN OTHERS THENRAISE NOTICE '发生异常了';RAISE NOTICE 'SQLSTATE:%', SQLSTATE;RAISE NOTICE 'SQLERRM:%', SQLERRM;
END;

输出语句

oracle : DBMS_OUTPUT.PUT_LINE, 变量使用 和字符串使用 || 拼接, 注意单引号需要使用转义字符  '

高斯: RAISE NOTICE, 变量使用站位符%(示例是高斯输出)

函数调用示例

1.使用PLSQL调用

DECLAREv_name varchar(30);
BEGINv_name := fun_get_ename(7788);RAISE NOTICE '7788的姓名是:%', fun_get_ename(7788);
END;

2.在SQL中调用

SELECT emp.*, fun_get_ename(empno) FROM emp;

输出语句和return

  • 输出语句的作用: 在函数执行过程中向客户端发送通知消息,这对于调试和日志记录非常有用。示例输出语句的作用是将变量v_ename的值打印出来,以便调试和查看

  • RETURN用于返回函数的结果,是函数调用时返回给调用者的值。

return和out参数

return : 用于从函数中返回一个值。函数必须通过 RETURN 语句返回一个值,且返回值的数据类型在函数定义时指定

out 参数:用于从函数中返回额外的值。OUT 参数允许函数返回多个值

  • 函数可以有多个 OUT 参数。

  • 只能在 PL/SQL 块中调用

示例

调用示例

IF v_status THEN 是合法的,因为 v_status 是一个布尔变量,IF 语句会根据它的值(TRUE 或 FALSE)来决定执行哪个分支

管理存储过程/自定义函数

修改存储过程/自定义函数

可以直接替换现有的存储过程/自定义函数

查看对象

查看源代码

删除存储过程/自定义函数

自定义函数也是

检查依赖关系(oracle)

USER_DEPENDENCIES 视图显示了当前用户下对象的依赖关系

检查其他用户的依赖关系,可以使用 ALL_DEPENDENCIES 视图(可以显示对象所有者: owner)

有DBA权限,可以使用 DBA_DEPENDENCIES 视图检查整个数据库中的依赖关系

使用时, 'UPDATE_VALUE'替换为需要检查依赖关系的对象名称

如果查询结果为空,说明没有其他对象依赖于该存储过程。

删除存储过程的权限

  • 存储过程的所有者。

  • 具有 DROP ANY PROCEDURE 权限的用户。

如果返回结果不为空,这意味着当前用户具有删除任何用户创建的存储过程和函数的权限

DROP ANY PROCEDURE 权限主要与存储过程相关,但它也涵盖了对函数的删除权限。 因为在Oracle的权限体系中,函数(FUNCTION)和存储过程(PROCEDURE)在很多情况下被视为类似的对象,尤其是在权限管理方面。

相关文章:

PLSQL: 存储过程,用户自定义函数[oracle]

注意: raise notice是高斯的输出语句; DBMS_OUT_PUT.PUT_LINE是oracle的输出语句 存储过程 Stored Procedure 存储过程可以封装数据访问逻辑,使得应用程序可以通过调用存储过程来执行这些逻辑,而不是直接执行SQL语句。这有助于提高代码的可重用性、可…...

深度学习-医学影像诊断

以下以使用深度学习进行医学影像(如 X 光片)的肺炎诊断为例,为你展示基于 PyTorch 框架的代码实现。我们将构建一个简单的卷积神经网络(CNN)模型,使用公开的肺炎 X 光影像数据集进行训练和评估。 1. 安装必…...

备战蓝桥杯:双指针(滑动窗口)算法之逛花展

P1638 逛画展 - 洛谷 | 计算机科学教育新生态 这道题我们只要用一个kind和一个mp[N]的数组就能解决了 我们的解法1就是暴力枚举,先固定2,从2开始找连续的满足所有种类的最短的子数组,然后固定5,3,1,3&…...

Linux如何设置软件开机启动呢?

有很多软件,我们安装完之后,服务器一旦重启,软件也需要我们手动再次启动,有很多的软件我们不想手动重启,例如Redis、Mysql、MQ等,那我们怎么配置软件跟着服务器也一起启动呢,今天就给大家带来软…...

Vue(3)

一.生命周期及其四个阶段 Vue生命周期&#xff1a;一个Vue实例从创建到销毁的整个过程 生命周期四个阶段&#xff1a;①创建②挂载③更新④销毁 <body><div id"app"><h3>{{ title }}</h3><div><button click"count--"&…...

11vue3实战-----封装缓存工具

11vue3实战-----封装缓存工具 1.背景2.pinia的持久化思路3.以localStorage为例解决问题4.封装缓存工具 1.背景 在上一章节&#xff0c;实现登录功能时候&#xff0c;当账号密码正确&#xff0c;身份验证成功之后&#xff0c;把用户信息保存起来&#xff0c;是用的pinia。然而p…...

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说&#xff0c; Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类&#xff0c;旅客(线程)分别手持登机牌和身份证接受工作人员的检查&#xff0c;示例代码如所示。…...

MySQL 8.0.41 终端修改root密码

1.在 MySQL 命令行中&#xff0c;运行以下命令修改密码 ALTER USER rootlocalhost IDENTIFIED BY new_password; 其中&#xff0c;new_password替换为你想要设置的新密码 2.退出 MySQL终端&#xff0c;重新打开&#xff0c;使用新密码进入&#xff0c;修改成功...

微信小程序案例2——天气微信小程序(学会绑定数据)

文章目录 一、项目步骤1 创建一个weather项目2 进入index.wxml、index.js、index.wxss文件,清空所有内容,进入App.json,修改导航栏标题为“中国天气网”。3进入index.wxml,进行当天天气情况的界面布局,包括温度、最低温、最高温、天气情况、城市、星期、风行情况,代码如下…...

android的Compose 简介

Jetpack Compose 简介 Jetpack Compose 是 Android 官方推出的声明式 UI 工具包&#xff0c;用于替代传统 XML 布局&#xff0c;简化界面开发流程。它基于 Kotlin 语言&#xff0c;通过函数式编程实现高效、灵活的 UI 构建&#xff0c;支持实时预览和更直观的状态管理。 优势…...

缓存实战:Redis 与本地缓存

引言 在现代互联网应用中&#xff0c;缓存是提升系统性能和用户体验的关键技术之一。通过将频繁访问的数据存储在快速访问的存储介质中&#xff0c;可以显著减少对数据库的直接访问压力&#xff0c;从而提高系统的响应速度和吞吐量。 本文将从实战的角度出发&#xff0c;详细…...

apisix的real-ip插件使用说明

k8s集群入口一般都需要过负载均衡&#xff0c;然后再到apisix。 这时候如果后台业务需要获取客户端ip&#xff0c;可能拿到的是lb或者网关的内网ip。 这里一般要获取真实ip需要做几个处理。 1. 负载均衡上&#xff0c;一般支持配置获取真实ip参数&#xff0c;需要配置上。然…...

音视频协议

1. 多媒体信息 1.1 多媒体信息的两个主要特点&#xff1a; 信息量很大 标准语音&#xff1a;64Kbits(8KHz采样&#xff0c;8位编码)高质量音频&#xff1a;3Mbps(100KHz采样&#xff0c;12位编码) 在传输多媒体数据时&#xff0c;对时延和时延抖动均有较高要求 1.2 处理时延…...

第一财经对话东土科技 | 探索工业科技新边界

当前以ChatGPT、Sora等为代表的生成式人工智能快速发展&#xff0c;越来越多面向垂直场景的行业大模型涌现出来&#xff0c;并成为推动制造业智能化改造与数字化转型、加快推进新型工业化&#xff0c;进而培育发展新质生产力的新引擎。 在垂类场景的应用落地&#xff0c;是AI发…...

Maven 与企业项目的集成

1. Maven 在企业级项目中的作用 Maven 是 Java 生态中最流行的构建和依赖管理工具&#xff0c;广泛用于企业级项目的构建、依赖管理、测试、打包、部署和 CI/CD 集成。对于大型企业项目&#xff0c;Maven 提供了一整套标准化的构建流程&#xff0c;并支持 多模块&#xff08;M…...

激活函数篇 01 —— 激活函数在神经网络的作用

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 激活函数篇 01 —— 一文搞懂激活函数在神经网络中的作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 1 激活函数的作用 1.1 引入非线性 激活函数…...

22.2、Apache安全分析与增强

目录 Apache Web安全分析与增强 - Apache Web概述Apache Web安全分析与增强 - Apache Web安全威胁Apache Web安全机制Apache Web安全增强 Apache Web安全分析与增强 - Apache Web概述 阿帕奇是一个用于搭建WEB服务器的应用程序&#xff0c;它是开源的&#xff0c;它的配置文件…...

Day.23

leetcode 413.等差数列划分 问题&#xff1a;如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。给你一个整数数组 nums &#xff0c;返回数组 nums 中所有为等差数组的 子数组 个数。 子数组 是数组中的一个连续序列…...

CentOS虚机在线扩容系统盘数据盘

最近在制作Openstack下的镜像&#xff0c;用户需要CentOS6以及CentOS7的虚机镜像&#xff0c;遇到了些关于系统盘以及数据盘在线扩容的问题&#xff0c;故此整理一下。 ​ 传统我们想对磁盘在线热扩容&#xff0c;必然会想到LVM逻辑卷。如果没有LVM逻辑卷的情况下&#xff0c;…...

动手写ORM框架 - GeeORM第一天 database/sql 基础

文章目录 1 初识 SQLite2 database/sql 标准库3 实现一个简单的 log 库4 核心结构 Session本文是7天用Go从零实现ORM框架GeeORM的第一篇。介绍了 SQLite 的基础操作(连接数据库,创建表、增删记录等)。使用 Go 语言标准库 database/sql 连接并操作 SQLite 数据库,并简单封装…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...