Oracle存储过程入门教程(通俗理解存储过程)

news2025/4/3 10:03:06

Oracle存储过程入门通俗介绍

  • 一、存储过程通俗理解
  • 二、创建存储过程基本语法(汇总)
  • 三、执行存储过程的方式(5种)
  • 四、网上现有的创建存储过程的两种方式解释(看注释)
  • 五、一些存储过程示例(仅供参考)
  • 六、其他语法
  • 七、未完、待续...

一、存储过程通俗理解

  • 简单理解存储过程是数据库SQL的操作语言,用于操作表数据,类似Java的方法,可以有入参,也可以有出参。开发存储过程需要熟悉一定的语法;
  • 存储过程是可以包含多个操作,如:表增删改查、判断、循环、异常捕获、嵌套存储过程等;
    • 举栗:有个业务需求,要求每天对购买商品大于1000元的买家发送抽奖信息短信及积分等级。 Java实现逻辑(仅仅是举例哈)可能是通过订单服务查询订单,然后再去用户服务查询用户信息,然后再去积分服务获取积分,获取以上数据后,再通过定时任务去执行该需求。
    • 分析:以上的操作涉及多个服务,并且发生多次数据库的网络IO连接,多次网络交互会造成性能开销大,导致不必要的资源浪费。 而若通过存储过程实现,则逻辑是:【创建存储过程–查询用户表–查询订单表–查询积分表,使用存储过程对上述数据遍历判断,数据插入到短信推送信息表】,这时Java代码只需要一次与数据库的IO链接获取短信推送信息,直接去执行发送短信即可。
  • Oracle数据库有声明,只要是对数据的操作可以使用存储过程执行,速度比其他语言获取数据再加工要快。

二、创建存储过程基本语法(汇总)

CREATE OR REPLACE PROCEDURE P_存储过程名(变量名 IN|OUT 数据类型)   -- 存储过程名称通常以P_开头
IS													-- IS作为申明变量的关键词
	V_NUM   	NUMBER;								-- 声明NUMBER类型的变量,后以分号结束
	V_USERNAME  VARCHAR2(40);						-- 声明VARCHAR2类型的变量
	V_SORT		INTEGER;							-- 声明Integer类型的变量
	V_IS_BIND   NUMBER(12);							-- 声明长度为12的NUMBER类型变量
	V_NAME 		T_USER.NAME%TYPE; 					-- 声明变量直接赋值(表中NAME类型和长度就是V_NAME的类型和长度)
	V_USER 		T_USER%ROWTYPE;						-- 声明记录型变量,相当于Java的对象,可以使用点加变量名获取值
	CURSOR T_USER IS SELECT NAME,AGE FROM T_USER;	-- 声明游标
	-- 此处只作演示所用,其他变量声明可参考博文下面的示例及注释;
BEGIN												-- 执行代码开始
	-- 执行的代码逻辑,类似Java的方法体
	V_USER := '张三';								-- 给变量赋值。语法是冒号后面跟等号
	DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'YYYYMMDD'));	-- 打印语句,相当于Java中的println方法
EXCEPTION											-- 异常
  WHEN OTHERS THEN ...								-- OTHERS相当于Java中的Exception,会捕获所有异常
END;												-- 执行代码结束,以分号结束,也有一些是END后跟储存过程名加分号

三、执行存储过程的方式(5种)

-- 方式一,在SQL>后面执行
EXEC 存储过程名(参数..);EXECUTE 存储过程名(参数..);

-- 方式二,在PL/SQL Developer的SQL窗口中执行(下有图)
BEGIN
	存储过程名(参数);	-- 执行的存储过程需要加分号
END;

-- 方式三,在PL/SQL Developer的Test窗口中执行,可执行debug,或者编译(下有图)
BEGIN
	存储过程名(参数);	--该种调用方式可调试
END;

-- 方式四,Java代码调用
CallableStatement callableStatement = connection.divpareCall("{call 存储过程名(?)}");

-- 方式五,在Mapper中调用,有入参和出参,使用<![CDATA[]]>包裹
<![CDATA[
	{CALL 存储过程名(#{name,mode=IN,jdbcType=VARCHAR},#{age,mode=OUT,jdbcType=INTEGER})}
]]>

在这里插入图片描述
在这里插入图片描述

四、网上现有的创建存储过程的两种方式解释(看注释)

-- 方式一:该方式类似创建一个Java类,形成一个P_PUSH_MSG.sql的文件,该可以编译后保存在数据库,方便以后执行;
CREATE OR REPLACE PROCEDURE P_PUSH_MSG(V_RETCODE OUT VARCHAR2, V_RETINFO OUT VARCHAR2) IS...


-- 方式二:该方式类似直接写的main方法,或者sql语句,不是文件,直接复制粘贴到其他地方执行、测试等。概念与上面方式一样;
DECLARE
	V_IS_BIND   NUMBER(12);
BEGIN
	...
END;

五、一些存储过程示例(仅供参考)

-- 示例一:数据库造数,不用手动插入了
DECLARE
  I NUMBER := 0;
BEGIN
  FOR I IN 1 .. 500 LOOP					-- 循环语法,循环500次
    INSERT INTO T_USER
      (ID, USERID, USERNAME, AGE, CREATE_TIME)
    VALUES
      (I, 'U_' + I, 'XXYZ' + I, I, SYSDATE);
  END LOOP;									-- 循环语法结束
  COMMIT;									-- 事务提交
END;

-- 示例二:
CREATE OR REPLACE PROCEDURE P_ORDER_LIST(V_IN_DATE NUMBER) IS
BEGIN
  DECLARE									-- CREATE OR REPLACE PROCEDURE里面是可以有DECLARE的
    V_IS_BIND   NUMBER(12);
    V_IS_WORK NUMBER(12);
    V_COUNT_DATE    NUMBER(12);
  BEGIN
	V_COUNT_DATE := V_IN_DATE;
	DELETE FROM T_PUSH_MSG_TEMP WHERE DT = V_COUNT_DATE; --删除临时表表 T_PUSH_MSG_TEMP

	FOR I IN (SELECT A.ID CPU_ID, A.UCXM, A.ORGID, L.NAME ORGNAME, Y.REGINON_ID, Y.REGINON_NAME FROM JYXX A
				LEFT JOIN (SELECT LBO.ID   BRANCH_ID,LBO.ID   REGINON_ID,LBO.NAME REGINON_NAME FROM ORGANIZATION N1) Y
				  ON A.ORGID = Y.BRANCH_ID
				LEFT JOIN ORGANIZATION L
				  ON A.ORGID = L.ID) LOOP		-- 循环语法为:FOR X IN () LOOP...
	  
	  -- 插入表
	  INSERT INTO T_PUSH_MSG_TEMP
		(DT, CPU_ID, CPU_NAME, IS_BIND, IS_BIND_RATE, REGION_ID, REGION_NAME, BRANCH_ID, BRANCH_NAME)
	  VALUES
		(V_COUNT_DATE,
		 I.CPU_ID,
		 I.UCXM,
		 V_IS_BIND,
		 CASE V_IS_WORK WHEN 0 THEN 0 ELSE		-- CASE WHEN 用法
		 ROUND(V_IS_BIND / V_IS_WORK, 2) END,   -- ROUND函数用法
		 I.REGINON_ID,
		 I.REGINON_NAME,
		 I.ORGID,
		 I.ORGNAME);
	END LOOP;
  END;
END;
-- 示例三:
CREATE OR REPLACE PROCEDURE P_QYWX_TEXT_SHYJ_MSG() IS
	V_COUNT          	NUMBER; 				-- 数量
BEGIN  
	SELECT COUNT(*) INTO V_COUNT FROM T_ENTRY_INFO WHERE ENTRY_DT = V_DATE;		-- 赋值用法,INTO关键字到变量V_COUNT中
	IF V_COUNT = 0 THEN                                                         -- IF判断用法
		-- 业务开始
		FOR A IN (SELECT CHARGE_NAME FROM T_ENTRY_INFO WHERE DEPT IN ('好好学习部','天天向上部')) LOOP	-- 循环用法
			SELECT SEQ_ENTRY_INFO.Nextval INTO ID FROM DUAL;					-- 查询序列
			INSERT INTO T_PUSH_MSG
				(ID, BUSINESS_TYPE, RECIVE_MOBILE, RECIVE_NAME, TITLE, CONTENT, CONTENT_ORDER, STATUS, CREATE_DATE, UPDATE_DATE)
			VALUES
				(ID,
				'DX',
				(SELECT MOBILE FROM T_EXT_USER WHERE NAME = A.CHARGE_NAME),
				A.CHARGE_NAME,
				'PLSQL',
				'存储过程示例',
				ID,
				'无',
				SYSDATE,
				NULL
			);
		END LOOP;
	ELSIF V_COUNT <10 THEN							-- 判断语句,类似Java的else if。 注意:这里是ELSIF,少个字母E
		DBMS_OUTPUT.PUT_LINE('T_ENTRY_INFO表记录数少于' || V_COUNT || '条。'); -- 拼接语法,使用双竖线拼接,相当于Java的加号
	ELSE											-- 判断语句,相当于Java的else
		DBMS_OUTPUT.PUT_LINE('T_ENTRY_INFO表记录数大于' || V_COUNT || '条。');
	END IF;
EXCEPTION											-- 异常捕获语句
  WHEN OTHERS THEN									-- OTHERS关键字,相当于Java中的Exception
	DBMS_OUTPUT.PUT_LINE(SQLERRM)					-- 异常原因:使用SQLERRM关键词相当于Java代码中的堆栈信息
END;

六、其他语法

DROP PROCEDURE 存储过程名;	-- 删除存储过程名

SET SERVEROUTPUT ON;		-- 若是没有执行输出语句,可以使用该命令

七、未完、待续…

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

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

相关文章

蒸馏+Distilling Knowledge via Knowledge Review论文笔记

文章目录一、前言二、蒸馏1.背景介绍2.知识蒸馏和迁移学习之间的区别3.Hinton提出的知识蒸馏Pipeline4.蒸馏的知识形式5.知识蒸馏的方法三、Distilling Knowledge via Knowledge Review论文笔记1.思想介绍2.Pipeline3.实验结果参考文献一、前言 近期在阅读cvpr 2021的一篇关于蒸…

通过Tomcat / Small Tomcat,如何部署Servlet?(超详细)

目录 基于Tomcat对Servlet进行部署 一、创建项目 二、引入Servlet依赖 三、构建目录结构 四、编写代码 五、打包程序 六、部署程序 七、验证程序 基于Smart Tomcat对Servlet进行部署 第一步&#xff1a;下载Smart Tomcat插件 第二步&#xff1a;进行相关配置 第三步…

【Unity3D】选中物体描边特效

1 前言 描边的难点在于如何检测和识别边缘&#xff0c;当前实现描边特效的方法主要有以下几种&#xff1a; 1&#xff09;基于顶点膨胀的描边方法 在 SubShader 中开 2 个 Pass 渲染通道&#xff0c;第一个 Pass 通道渲染膨胀的顶点&#xff0c;即将顶点坐标沿着法线方向向外扩…

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之一

BLE 的HIDS服务&#xff0c;可以理解为BR/EDR HID在BLE 上的简化版&#xff0c;因BLE的特殊性&#xff0c;BR/EDR HID的部分feature在HIDS 中被移除。 本文将讨论Android 蓝牙BLE 中HIDS 服务如何接收 Data 并写入到Android 节点"/dev/uhid"的flow。----关于Android…

openpowerlink 01

源码地址&#xff1a; https://sourceforge.net/projects/openpowerlink/ 源码目录 qt 源码目录 qt MN 源码 MN是主站的意思 用cmake 构建 qt cmakelists.txt分析 文件 mnobd.cdc&#xff1a; 此文件用于配置 MN 堆栈。它包括MN和所有CN的所有配置数据&#xff0c;包括网…

云安全解决方案安全保障体系框架

安全需求和挑战 从风险管理 的角度讲&#xff0c;主要就是管理资产、威胁、脆弱性和防护措施及其相关关系&#xff0c;最终保障云计算平台的持续安全&#xff0c;以及 其所支撑的业务的安全。 云计算 平台是在传统 IT技术的基础上&#xff0c;增加了一个虚拟化层&#xff0c;并…

[Spring MVC7] 解决Redis乱码前缀问题

最近在做Redis缓存的时候&#xff0c;遇到了一个棘手的问题&#xff0c;简单来说就是项目使用Spring的RedisTemplate进行Redis数据存取操作&#xff0c;实际应用中发现Redis中key和value会出现“无意义”乱码前缀。如果是普通的java程序是没有这个问题。 本文解决Redis乱码问题…

基于Matlab-gui信号系统设计

目 录 1绪论 - 1 - 2系统分析和开发软件概述 - 6 - 2.1 需求分析 - 6 - 2.2系统开发环境和运行环境 - 6 - 2.3 Matlab图形用户界面(GUI) - 6 - 2.4 系统主要目标及功能 - 7 - 2.4.1 系统目标 - 7 - 2.4.2 系统主要功能 - 8 - 3系统软件平台的设计 10 3.1系统整体框图 10 3.2系统…

阿里的三个「价值支点」

历史总是轮回的。 2015年5月&#xff0c;身处低谷的阿里换了掌舵人&#xff0c;张勇由COO升任CEO&#xff0c;随后进行了一轮组织架构调整&#xff0c;并通过新零售、淘宝直播、阿里云等业态为阿里安上未来发展引擎。 当时的阿里市值涨至2000亿美元左右&#xff0c;华尔街投资…

终端天线—11.NFC线圈仿真

NFC线圈单体仿真 NFC线圈主要根据终端设备预留的空间大小&#xff0c;去设计走线宽度和圈数以及面积&#xff0c;NFC单体主要关注其13.56MHz处的电感量大小&#xff0c;以及阻抗的虚部和实部&#xff0c;可以根据ST和NXP芯片的要求去设计。 一、Original model 1.Simulation …

C语言文件操作【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;为什么使用文件&#xff0c;什么是文件&#xff0c;文件的打开和关闭的操作方法&#xff0c;文件的顺序读写于随机读写&#xff0c;文件读取结束的判定&#x1f440;。 文章目录一、为什么使用文件&#x1f356;二、什么是文件&…

React 入门:使用脚手架写一个Hello组件

文章目录本文目标开发前的准备编写主页面 index.html编写外壳组件 App.js编写入口文件 index.js代码组件化开发 Hello 组件开发 Welcome 组件引用组件组件化实现效果样式的模块化提升编码效率本文目标 通过使用脚手架确实让我们很方便的创建一个 React 项目基础代码结构&#…

力扣(LeetCode)11. 盛最多水的容器(C++)

双指针贪心 盛水的面积 长度 \times 左右柱子最低高度 area(r−l)min(height[l],height[r])area (r-l)\times min(height[l],height[r])area(r−l)min(height[l],height[r]) 初始时&#xff0c;我们不知道每个柱子的高度&#xff0c;但是我们可以选取最左侧柱子和最右侧柱子…

期望E与高斯分布的期望

目录 1. 期望定义 2. 期望性质 2.1 用期望定义方差 / 标准差 方差定义 标准差定义 方差的表示——离散型&#xff1a; 方差的表示——连续型&#xff1a; 方差的性质 3. (一元)高斯分布定义 4. (一元)高斯分布的性质 5. 二维随机向量的数学期望E与方差σ 参考 1. …

PyCharm安装部署(一) 百篇文章学PyQT

本文章是百篇文章学PyQT的第一篇&#xff0c;本文讲述如何安装PyCharm IDEA工具&#xff0c;其它工具也可以但是PyCharm 相对来说用的人多大家都认可(方案成熟)&#xff0c;pycharm是一款功能强大的python编辑器&#xff0c;具有跨平台性&#xff0c;本文介绍一下pycharm在wind…

SSM 医院在线挂号系统

SSM 医院在线挂号系统 SSM 医院在线挂号系统 功能介绍 首页 登录注册 图片轮播展示 系统简介 系统公告 医院介绍 医生展示 医院资讯 预约挂号 收藏 评论 在线留言 查看留言 后台管理 登录 管理员管理 修改密码 医院信息管理 医生信息管理 用户权限管理 科室信息管理 预约挂号…

微信小程序如何转云开发

微信小程序云开发&#xff0c;为前端全栈开发提供了很大的便利。本文主要介绍普通的微信小程序如何让转为云开发。 一、建cloudfunction文件夹 cloudfunction文件夹建立在小程序的根目录下。 二、修改 project.config.json配置 在 project.config.json文件中&#xff0c;添加&…

ip子网的划分方法

目录 1 子网划分的定义&#xff1a; 2 掩码介绍 3、子网划分要解决的问题&#xff1a; 4 子网划分步骤 5 范例1根据ip和掩码求子网和网络广播地址&#xff1a; 6 范例2根据ip和掩码求同网段地址 7 合并子网的例子根据ip范围合并&#xff0c;并添加回程路由&#xff1a; …

还不进来看吗?c趁你不注意偷偷将你的数据类型转换啦

前言 如果不了解 整形提升 的小伙伴可就要注意了,c偷偷将你的数据类型改变了你都不知道.快点和牛牛一起学习一下c语言中 整形提升的知识吧 ! 一、整形提升是什么&#xff0c;又是怎样提升的? 不知道小伙伴们有没有听过整形提升这个词? 整形提升是什么呢? C语言中,在进行…

[附源码]java毕业设计石林县石漠化信息查询分析系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…