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

article/2025/9/29 19:02:31

Oracle存储过程入门通俗介绍

  • 一、118个真实应用场景的Oracle存储过程案例及开发指南
  • 二、存储过程通俗理解
  • 三、创建存储过程基本语法(汇总)
  • 四、执行存储过程的方式(5种)
  • 五、网上现有的创建存储过程的两种方式解释(看注释)
  • 六、一些存储过程示例(仅供参考)
  • 七、其他语法
  • 八、未完、待续...

一、118个真实应用场景的Oracle存储过程案例及开发指南

         【118个真实应用场景的Oracle存储过程案例及开发指南】

           本资源提供了100多种真实业务场景Oracle存储过程的案例,类资料内容全面、丰富,精简概括,易于理解。无论您是新手还是有经验的开发人员,都可以从中获得启示和帮助,逐步提升自己的存储过程编程能力。→→→【传送门】
    

二、存储过程通俗理解

  • 简单理解存储过程是数据库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语句,不是文件,直接复制粘贴到其他地方执行、测试等。概念与上面方式一样;
DECLAREV_IS_BIND   NUMBER(12);
BEGIN...
END;

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

-- 示例一:数据库造数,不用手动插入了
DECLAREI NUMBER := 0;
BEGINFOR 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
BEGINDECLARE									-- CREATE OR REPLACE PROCEDURE里面是可以有DECLARE的V_IS_BIND   NUMBER(12);V_IS_WORK NUMBER(12);V_COUNT_DATE    NUMBER(12);BEGINV_COUNT_DATE := V_IN_DATE;DELETE FROM T_PUSH_MSG_TEMP WHERE DT = V_COUNT_DATE; --删除临时表表 T_PUSH_MSG_TEMPFOR I IN (SELECT A.ID CPU_ID, A.UCXM, A.ORGID, L.NAME ORGNAME, Y.REGINON_ID, Y.REGINON_NAME FROM JYXX ALEFT JOIN (SELECT LBO.ID   BRANCH_ID,LBO.ID   REGINON_ID,LBO.NAME REGINON_NAME FROM ORGANIZATION N1) YON A.ORGID = Y.BRANCH_IDLEFT JOIN ORGANIZATION LON 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() ISV_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,少个字母EDBMS_OUTPUT.PUT_LINE('T_ENTRY_INFO表记录数少于' || V_COUNT || '条。'); -- 拼接语法,使用双竖线拼接,相当于Java的加号ELSE											-- 判断语句,相当于Java的elseDBMS_OUTPUT.PUT_LINE('T_ENTRY_INFO表记录数大于' || V_COUNT || '条。');END IF;
EXCEPTION											-- 异常捕获语句WHEN OTHERS THEN									-- OTHERS关键字,相当于Java中的ExceptionDBMS_OUTPUT.PUT_LINE(SQLERRM)					-- 异常原因:使用SQLERRM关键词相当于Java代码中的堆栈信息
END;

七、其他语法

DROP PROCEDURE 存储过程名;	-- 删除存储过程名SET SERVEROUTPUT ON;		-- 若是没有执行输出语句,可以使用该命令

八、未完、待续…


http://chatgpt.dhexx.cn/article/USivfNst.shtml

相关文章

MySQL存储过程示例

实例1&#xff1a; 为了演示MySQL中的存储过程&#xff0c;我们先创建一些表和数据&#xff1a; drop table if exists my_test_table; create table my_test_table (id integer primary key not null AUTO_INCREMENT,name varchar(20),age integer,point double ); insert int…

mysql 存储过程详解

前言 在项目开发中&#xff0c;经常会遇到这样一种场景&#xff0c;当修改A表的一条数据时&#xff0c;需要关联修改B表、C表甚至其他更多表的数据&#xff0c;为什么会这样呢&#xff1f; 在真实的业务场景中&#xff0c;往往一张表的数据关联的业务是多样的&#xff0c;举例…

mysql存储过程call_mysql call 存储过程

PHP调用MYSQL存储过程实例 PHP调用MYSQL存储过程实例 标签&#xff1a; mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一&#xff1a;无参的存储过程$conn mysql_connect(localhost,root,root) o... 文章 thinkyoung 2016-01-20 544浏览量 存…

ORACLE存储过程

oracle存储过程 目录 oracle存储过程 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 4.案例实战 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 4.案例实战 附.参考资料 一.什…

Greenplum创建存储过程

1.美图 1.对比 greenplum 的plpgsql 注意: greenplum 的plpgsql 与 postgresql 不是完全兼容的。plpgsql 不明确界定 函数和存储过程&#xff0c;“returns void” 表示 存储过程&#xff0c;“return 数据类型” 表示 函数。greenplum中的函数分成3种类型: immutable(不可变…

Mysql 创建存储过程和函数及各种例子

Mysql 创建存储过程和函数及各种例子 1. Mysql 创建存储过程1.1 前言知识1.1.1 语法结构1.1.2 简单解释 1.2 创建存储过程入门例子1.2.1 无参存储过程1.2.1.1 不带变量1.2.1.2 带变量 1.2.2 有入参的存储过程1.2.3 有出参的存储过程1.2.4 有入参和存储的存储过程1.2.5 inout的存…

oracle 存储过程 实例 循环 给查询赋值 游标取值

CREATE OR REPLACE PROCEDURE p_updete_gs is --仅供参考 i_jdid varchar(32); i_ryid varchar(32); cursor cur is --游标 给查询赋值 select c.jdid jdid, t.ryid rybh from t_zcj_rctj t,t_zj_jd c where t.ryidc.rybh and t.bgzt<>3 and c.bgzt<>…

SQL存储过程实例详解

SQL存储过程实例详解 本文用3个题目&#xff0c;从建立数据库到创建存储过程&#xff0c;详细讲解数据库的功能。 题目1 学校图书馆借书信息管理系统建立三个表&#xff1a; 学生信息表&#xff1a;student 字段名称 数据类型 说明 stuID char(10) 学生编号&#xff0c;主…

oracle存储过程实例

认识存储过程和函数 存储过程和函数也是一种PL/SQL块&#xff0c;是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序&#xff0c;我们通常把PL/SQL程序称为无名块&#xff0c;而存储过程和函数是以命名的方式存储于数据库中的。和PL/SQL程序相比&#xff…

MySQL存储过程实例

1、简单实例 create procedure demo.p_test1() begin-- 使用 declare语句声明一个变量declare id int default 0;declare name varchar(50) default ;-- 使用set语句给变量赋值set id7521;-- 将users表中id1的名称赋值给usernameselect ename into name from demo.emp where e…

存储过程详解与实例

存储过程 1、存储过程的优缺点 优点 通过把处理封装在容易使用的单元中&#xff0c;简化复杂的操作&#xff1b;简化对变动的管理&#xff1b;通常存储过程有助于提高应用程序的性能&#xff1b;存储过程有助于减少应用程序和数据库服务器之间的流量&#xff0c;因为应用程序…

数据库存储过程讲解与实例

目录 1 存储过程简介 2 存储过程使用 2.1 创建存储过程 2.2 in&#xff0c;out以及inout 1 存储过程简介 SQL语句需要先编译然后执行&#xff0c;而存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中…

【数据库】ACID底层实现原理

前言 我们在学MySQL的时候事务是必须要知道的部分&#xff0c;也就是原子性(Atomic)、一致性(Consistency)、隔离性(isolation)和持久性(Persistence)。知道他的概念其实是远远不够的&#xff0c;现在越来越卷&#xff0c;那么就必须知道的他的原理什么&#xff1f;怎么是实现…

数据库-ACID

ACID:原子性、持久性、一致性、独立性 事务的原子性(Atomicity)&#xff1a;是指一个事务要么全部执行&#xff0c;要么不执行&#xff0c;也就是说一个事务不可能只执行了一半就停止了。比如你从取款机取钱&#xff0c;这个事务可以分成两个步骤&#xff1a;1划卡&#xff0c;…

Mysql ACID详解

ACID简述 Atomicity、Durability实现之 &#xff08;WALredo log&#xff09; Atomicity 、Isolation实现之 &#xff08;锁 OR undo logMVCC&#xff09; 一、前言 主要是后台程序员都会和数据库打交道&#xff0c;最常用的关系型数据库是MySQL&#xff0c;最常用的存储引擎是…

数据库acid实现原理(二)

一、基础概念 事务&#xff08;Transaction&#xff09;是访问和更新数据库的程序执行单元&#xff1b;事务中可能包含一个或多个sql语句&#xff0c;这些语句要么都执行&#xff0c;要么都不执行。作为一个关系型数据库&#xff0c;MySQL支持事务&#xff0c;本文介绍基于MyS…

什么是 ACID

MySQL ACID及四种隔离级别的解释 脏读、非重复读、幻读 ACID&#xff0c;是指数据库管理系统&#xff08;DBMS&#xff09;在写入或更新资料的过程中&#xff0c;为保证事务&#xff08;transaction&#xff09;是正确可靠的&#xff0c;所必须具备的四个特性&#xff1a;原子性…

MySQL的ACID是如何实现的?

写在前面 本文主要探讨MySQL InnoDB 引擎下ACID的实现原理&#xff0c;对于诸如什么是事务&#xff0c;隔离级别的含义等基础知识不做过多阐述。 ACID MySQL 作为一个关系型数据库&#xff0c;以最常见的 InnoDB 引擎来说&#xff0c;是如何保证 ACID 的。 &#xff08;Atomi…

数据库的ACID原则

一、 事务的ACID属性 原子性&#xff08;Atomicity&#xff09; 原子性是指事务是一个不可分割的工作单位&#xff0c;事务中的操作要么都发生&#xff0c;要么都不发生。 一致性&#xff08;Consistency&#xff09; 事务必须使数据库从一个一致性状态变换到另外一个一致性状…

ACID理论

ACID 理论是对事务特性的抽象和总结&#xff0c;方便我们实现事务。可以理解成&#xff1a;如果实现了操作的 ACID 特性&#xff0c;那么就实现了事务。 1. 事务是什么 事务可以看成是一个或者多个操作的组合操作&#xff0c;并且它对这个组合操作提供一个保证&#xff0c;如果…