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)在很多情况下被视为类似的对象,尤其是在权限管理方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始玩转Docker:轻松开启容器化之旅

一、什么是 Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。简单来说,Docker 就像是一个超级 “快递箱”&#xff0c…

deepseek+kimi自动生成ppt

打开deepseek官网,输入详细的需求,让他生成个ppt 接着deepseek开始思考生成了 接着复制生成了的内容 打开kimi粘贴刚才deepseek生成的内容 可以一键生成啦,下载编辑使用吧

单张照片可生成写实3D头部模型!Adobe提出FaceLift,从单一的人脸图像中重建出360度的头部模型。

FaceLift是Adobe和加州大学默塞德分校推出的单图像到3D头部模型的转换技术,能从单一的人脸图像中重建出360度的头部模型。FaceLift基于两阶段的流程实现:基于扩散的多视图生成模型从单张人脸图像生成一致的侧面和背面视图;生成的视图被输入到GS-LRM重建器中,产出详细的3D高斯表…

机器学习:朴素贝叶斯分类器

贝叶斯决策论是概率框架下实施决策的基本方法,对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。 贝叶斯定理是贝叶斯决策论的基础,描述了如何根据新的证据更新先验概率,贝叶斯定理&…

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…

excel合并表格

上一章说到excel拆分表格,可以按一列的不重复数据自动拆分成多个表格。这个功能主要适用于有多个下级机构的部门分发表格使用。表格分发完成,下级单位修改后,上传到我们这里。我们还得把这些表格合并成一个表。如果利用复制粘性,工…

区块链100问之加密算法

区块链100问之加密算法 文章目录 区块链100问之加密算法哈希算法是什么?有什么特征?哈希碰撞是什么?雪崩效应呢?如何解决?哈希算法的作用?对称加密和非对称加密有什么区别?为什么会引入非对称加密&#xf…

HTML应用指南:利用GET请求获取全国盒马门店位置信息

随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从盒马…

(原创,可用)SSH实现内外网安全穿透(安全不怕防火墙)

目前有A、B终端和一台服务器,A、B机器不能直接访问,服务器不能直接访问A、B终端但是A、B终端可以访问服务器,这个场景很像我们有一台电脑在单位内网,外机器想访问内网系统,可能大家目前想到的就是frp之类穿透工具&…

keil5显示[NO J-link found]解决办法——【J-LINK】驱动下载安装教程

打开电脑的设备管理器,检查通用串行总线控制器 看这里发现没有J-link driver,于是开始安装下驱动。 一、下载 打开J-link下载官网链接: SEGGER - The Embedded Experts - Downloads 点击左下角下载按钮 二、安装 等待下载完成以后双击下载…

Maven的dependencyManagements锁定版本依赖

Pom工程的父项目定义的依赖 <dependencyManagement><dependencies><!--springcloud 2023.0.0--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version&g…

Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

前言 在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻改变着我们的生活和工作方式。从智能语音助手到自动化流程机器人&#xff0c;AI 的应用无处不在&#xff0c;为我们提供了更加便捷、高效的服务。然而&#xff0c;对于非专业人士来…

【文献讲解】《Non-local Neural Networks》

一、引言 传统的深度学习方法(如卷积神经网络CNN和循环神经网络RNN)在捕捉长距离依赖关系时存在局限性。CNN主要关注局部邻域的特征,而RNN则依赖于序列的递归计算,无法直接捕捉全局信息。为了解决这一问题,本文提出了一种非局部神经网络(Non-local Neural Networks),通…

BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长&#xff0c;光伏…

经典题型:求数组中逆序对的数量

经典题型&#xff1a;求数组中逆序对的数量 题目思路代码 题目 链接 思路 步骤一&#xff1a;两个指针指向两个有序区间&#xff0c;进行合并操作。 步骤二&#xff1a;1与前面的区间&#xff0c;构成逆序对&#xff0c;个数就是前面区间的个数。 步骤三&#xff1a;前面数组…

ASP.NET Core 如何使用 C# 向端点发出 POST 请求

使用 C#&#xff0c;将 JSON POST 到 REST API 端点&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要从端点获取数据&#xff0c;请参阅本文。 使用 . 将 JSON 数据发布到端点非常容易HttpClien…

Flink CDC YAML:面向数据集成的 API 设计

摘要&#xff1a;本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;老师在 Flink Forward Asia 2024 数据集成&#xff08;一&#xff09;专场中的分享。主要分为以下四个方面&#xff1a; Flink CDC YAML API Transform A…

清理软件——软媒清理大师

随着电脑使用时间的增加&#xff0c;系统垃圾文件也会不断累积&#xff0c;导致C盘空间逐渐变得紧张。今天&#xff0c;我为大家推荐一款专业的清理软件——软媒清理大师&#xff0c;它能够高效地清理电脑中的无用垃圾文件&#xff0c;为您的电脑“减负”。 清理软件——软媒清…

【C++八股】 前置 ++i vs. 后置 i++ 的区别

在 C 中&#xff0c; 运算符有前置 i 和后置 i 两种方式&#xff0c;它们都能让变量自增 1&#xff0c;但在执行顺序、性能、应用场景上有所不同。 1. i vs. i 对比表 2. 代码示例 #include <iostream> int main() {int a 5, b 5;std::cout << "a "…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…