Oracle中的存储过程是一组为了完成特定功能而预先编译并存储在数据库中的SQL语句和PL/SQL代码块。它可以接受参数、执行操作(如查询、插入、更新、删除数据等),并返回结果。以下从多个方面详细讲解:

1. 存储过程的创建

创建存储过程使用 CREATE OR REPLACE PROCEDURE 语句,基本语法如下:

CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter1 [IN | OUT | IN OUT] data_type [:= default_value],parameter2 [IN | OUT | IN OUT] data_type [:= default_value],...)]
IS-- 声明部分,用于声明变量、游标等variable1 data_type;variable2 data_type := initial_value;
BEGIN-- 执行部分,包含SQL语句和PL/SQL逻辑-- 例如,插入数据INSERT INTO your_table (column1, column2) VALUES (parameter1, variable1);-- 更新数据UPDATE your_table SET column2 = parameter2 WHERE column1 = variable2;-- 可以进行条件判断IF variable1 > 10 THEN-- 执行某些操作DELETE FROM your_table WHERE column1 = variable2;END IF;-- 循环操作FOR i IN 1..10 LOOP-- 执行循环内的操作INSERT INTO another_table (column3) VALUES (i);END LOOP;
EXCEPTION-- 异常处理部分,捕获并处理执行过程中的异常WHEN NO_DATA_FOUND THEN-- 处理没有找到数据的异常DBMS_OUTPUT.PUT_LINE('没有找到数据');WHEN OTHERS THEN-- 处理其他异常DBMS_OUTPUT.PUT_LINE('发生其他错误:'|| SQLERRM);
END;
  • CREATE [OR REPLACE]CREATE 用于创建新的存储过程,OR REPLACE 表示如果存储过程已存在,则替换它。这样可以在不删除存储过程的情况下修改其定义。
  • procedure_name:存储过程的名称,遵循数据库对象命名规则。
  • parameter:存储过程可以有零个或多个参数。参数类型分为 IN(输入参数,默认类型,用于向存储过程传递值)、OUT(输出参数,用于从存储过程返回值)和 IN OUT(既可以输入值,也可以返回值)。参数可以有默认值。
  • IS:开始声明部分,用于声明存储过程内部使用的变量、游标等。
  • BEGIN:开始执行部分,包含实际要执行的SQL语句和PL/SQL逻辑。
  • EXCEPTION:异常处理部分,用于捕获并处理执行过程中可能出现的异常。

2. 存储过程的调用

调用存储过程有两种常见方式,取决于存储过程是否有参数:

  • 无参数存储过程调用
BEGINprocedure_name;
END;

例如,假设存在一个名为 delete_old_records 的无参数存储过程,用于删除旧记录:

BEGINdelete_old_records;
END;
  • 有参数存储过程调用
BEGINprocedure_name(parameter1_value, parameter2_value);
END;

如果存储过程有 IN 参数,可以直接传递值;如果有 OUTIN OUT 参数,需要先声明变量来接收返回值。例如,假设有一个存储过程 calculate_total,用于计算订单总金额并返回:

DECLAREtotal_amount NUMBER;
BEGINcalculate_total('2023 - 10 - 01', '2023 - 10 - 31', total_amount);DBMS_OUTPUT.PUT_LINE('订单总金额为:'|| total_amount);
END;

这里 calculate_total 存储过程接受两个 IN 参数(日期范围)和一个 OUT 参数(用于返回总金额)。

3. 存储过程的优势

  • 提高代码复用性:将常用的业务逻辑封装在存储过程中,不同的应用程序或SQL脚本可以多次调用,避免重复编写相同的代码。
  • 增强安全性:通过对存储过程授权,而不是直接对底层表授权,可以限制用户对数据的访问方式和范围。用户只能通过执行存储过程来操作数据,而不能直接访问表,从而保护数据的完整性和安全性。
  • 提升性能:存储过程在数据库服务器端编译并存储,执行时直接从服务器端调用,减少了网络传输开销。而且,数据库可以对存储过程进行优化,缓存执行计划,提高执行效率。
  • 简化应用程序开发:应用程序只需调用存储过程,而无需关心复杂的SQL逻辑和数据处理细节,降低了开发难度,提高了开发效率。

4. 存储过程的调试

  • 使用 DBMS_OUTPUT:在存储过程中使用 DBMS_OUTPUT.PUT_LINE 语句输出调试信息。在调用存储过程之前,需要先设置 SET SERVEROUTPUT ON 开启输出功能。例如:
CREATE OR REPLACE PROCEDURE test_proc
IS
BEGINDBMS_OUTPUT.PUT_LINE('进入存储过程');-- 其他逻辑DBMS_OUTPUT.PUT_LINE('离开存储过程');
END;

然后调用存储过程:

SET SERVEROUTPUT ON;
BEGINtest_proc;
END;
  • 使用Oracle SQL Developer等工具:这些工具提供了可视化的调试界面,可以设置断点、查看变量值、单步执行存储过程等,方便定位和解决问题。

5. 存储过程的管理

  • 查看存储过程定义:可以使用 DESC 命令查看存储过程的参数列表,使用 USER_SOURCE 视图查看存储过程的源代码。例如,查看 test_proc 的参数:
DESC test_proc;

查看 test_proc 的源代码:

SELECT text
FROM USER_SOURCE
WHERE name = 'TEST_PROC'
ORDER BY line;
  • 修改存储过程:使用 CREATE OR REPLACE PROCEDURE 语句重新创建存储过程,即可修改其定义。
  • 删除存储过程:使用 DROP PROCEDURE 语句删除存储过程。例如:
DROP PROCEDURE test_proc;

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

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

相关文章

tc工具-corrupt 比 delay/loss 更影响性能

1. netem corrupt 5% 的作用 功能说明 corrupt 5% 表示 随机修改 5% 的数据包内容(如翻转比特位),模拟数据损坏。它本身不会直接丢弃或延迟数据包,而是让接收端收到错误的数据(可能触发校验和失败、协议层重传等&…

Flask YAML管理工具

项目概述 项目地址:https://github.com/KaiqiZing/Flask_Yaml_Demo 这是一个基于Flask开发的YAML文件管理工具,提供了完整的YAML文件查看、编辑、管理功能,具有现代化的Web界面和强大的编辑能力。 核心功能 1. 文件管理功能 目录扫描&am…

Embedding模型微调实战(ms-swift框架)

目录 简介 1. 创建虚拟环境 2 安装ms-swift 3安装其他依赖库 4. 下载数据集 5.开始embedding模型训练 6. 自定义数据格式和对应的Loss类型 (1) infoNCE损失 (2)余弦相似度损失 (3)对比学习损失 (4).在线对比学习损失 &#…

从性能优化赛到社区Committer,走进赵宇捷在Apache Fory的成长之路

Apache Fory 是一个基于JIT和零拷贝的高性能多语言序列化框架,实现了高效紧凑的序列化协议,提供极致的性能、压缩率和易用性。在多语言序列化框架技术领域取得了重大突破,推动序列化技术步入高性能易用新篇章!这一切,都…

Python实例题:基于 Flask 的任务管理系统

目录 Python实例题 题目 要求: 解题思路: 代码实现: Python实例题 题目 基于 Flask 的任务管理系统 要求: 使用 Flask 框架构建一个任务管理系统,支持以下功能: 用户认证(注册、登录、…

利用GPU加速TensorFlow

一、写在前面 我们已经依靠keras和TensorFlow给大家做了一些机器学习在图像处理中的应用(影像组学学习手册,基于深度学习的图像分类任务),此前的教程中我们没有用GPU进行加速,但是相较于CPU而言,GPU是设计用于处理大规模并行计算任务的硬件&…

模型预测专题:强鲁棒性DPCC

0 1 前言 在进行DPCC的学习过程中,于下面链接看到了一篇强鲁棒性算法;感觉挺有意思的,学习一下。 永磁同步电机高性能控制算法(12)——基于预测电流误差补偿的强鲁棒预测控制/参数辨识&有限集预测控制与连续集预…

修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题

https://wiki.archlinux.org/title/Talk:RabbitMQ 报错 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地图有哪些库

以下是前端开发GIS地图常用的库&#xff1a; Leaflet&#xff1a;轻量级、易于使用的开源JavaScript库&#xff0c;具有丰富的地图功能和插件生态系统&#xff0c;支持多种地图数据源&#xff0c;适合初学者和专业开发者。其优势在于简洁性和易用性&#xff0c;代码结构清晰&am…

赋能城市安全韧性|众智鸿图总裁扈震受邀出席智慧城市大会发表主题报告

——“众智鸿图作为城市基础设施智能化综合服务提供商&#xff0c;以地理信息科学、时空大数据、人工智能为核心能力&#xff0c;长期深耕于燃气、供水、排水等城市基础设施生命线领域及港口、园区等工业领域&#xff0c;致力于为城市稳定运行与高效发展提供坚实保障。” 2025年…

【大语言模型入门】—— 浅析LLM基座—Transformer原理

【大语言模型入门】—— 浅析LLM基座—Transformer原理 解密GPT核心技术&#xff1a;Transformer架构深度解析被反复强调的核心概念意味着什么&#xff1f; GPT预测机制解析&#xff1a;从Next Token Prediction到任务推理核心机制的本质案例驱动的机制解析解构策略&#xff1a…

Django打造智能Web机器人控制平台

Django 实现 Web 机器人控制 以下是关于 Django 实现 Web 机器人控制管理的实例思路和关键代码片段,涵盖多个常见场景。由于篇幅限制,剩余的可通过类似模式扩展。 基础机器人模型定义 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…

周赛98补题

题目意思&#xff1a; 给定一个数字判断加上自身任意因子数&#xff0c;是否能成为一个奇数。 思路&#xff1a; 我们想一个最简单的判断方法&#xff0c; 任意的数字的因子数都有1&#xff0c;故&#xff0c;最简单的方法就是判断奇偶。 奇数1成偶数&#xff0c;偶数1成奇…

【STM32】 STM32低功耗模式详解:睡眠模式与唤醒机制【待测试】

本篇知识点基于F0讲解 一、STM32三种低功耗模式参考表格 模式功耗唤醒时间保持状态典型应用场景睡眠模式中等 (mA级)最短 (μs级)CPU停止&#xff0c;外设保持短暂待机&#xff0c;快速响应停止模式低 (μA级)中等 (ms级)RAM保持&#xff0c;时钟停止长时间待机&#xff0c;电…

【Vue入门学习笔记】Vue核心语法

目录 准备工作删除不需要的代码 模版语法文本插值使用JavaScript表达式无效写法原始HTML 属性绑定简写布尔型Attribute动态绑定多个值 准备工作 删除不需要的代码 删除components下的文件 进入App.vue 删掉代码&#xff0c;只保留如下内容 <template></template&g…

ClickHouse 窗口分析 argMax() / argMin()

argMin() 是 ClickHouse 中一个非常有用的聚合函数&#xff0c;它可以找出某个列的最小值&#xff0c;并返回该最小值对应的另一个列的值 函数语法 argMin(arg, val) arg&#xff1a;要返回的列&#xff08;当找到最小值时返回该列的值&#xff09; val&#xff1a;用于比较的…

k8s client 通过KubeConfig和证书方式连接api server

一、背景 本文以kubePi这样一个k8s客户端为示例,使用证书方式,怎么连接k8s集群。 然后告诉你证书是如何生成的, 最后通过一个Python编程示例,在程序里如何使用。 api server地址:比如https://110.206.56.308:6443 Certificate:证书内容 Certificate Key:证书的私钥 先…

(2025.07)解决——ubuntu20.04系统开机黑屏,左上角光标闪烁

前面一些碎碎念&#xff1a; 电脑装的双系统&#xff0c;之前都还好着&#xff0c;今天突然ubuntu开机的时候黑屏了&#xff0c;左上角有光标在闪烁&#xff0c;也查了一些资料&#xff0c;基本上大家的都是驱动有问题&#xff0c;还有内存问题。&#xff08;个人建议&#xff…

一文讲清libmodbus在STM32上基于FreeRTOS的移植

libmodbus 开发库概述 libmodbus是一个免费的跨平台支持RTU和TCP的Modbus库&#xff0c;遵循LGPL V2.1协议。libmodbus支持Linux、 Mac Os X、 FreeBSD、 QNX和Windows等操作系统。 libmodbus可以向符合Modbus协议的设备发送和接收数据&#xff0c;并支持通过串口或者TCP网络进…

go语言安装达梦数据完整教程

一、安装 go-dm 驱动 1. 使用 go get 命令安装 # 打开PowerShell或命令提示符 go get github.com/dmdbms/go-dm# 若网络问题&#xff0c;配置代理 go env -w GOPROXYhttps://goproxy.cn,direct2. 验证驱动安装 go list -m github.com/dmdbms/go-dm# 预期输出类似 github.com…