存储过程关于LOOP循环问题
本随笔文章,由个人博客(鸟不拉屎)转移至博客园
发布时间: 2018 年 10 月 17 日
原地址:https://niaobulashi.com/archives/procedures_loop.html
存储过程LOOP疑问
今天在开发需求时,需要编写一个存储过程,实现数据的初始化功能。
发现遇到循环处理时,跳出循环的条件,Loop的处理
LOOP EXIT WHRN(P1 > P2);
...
END LOOP;
emmmmmm,因为之前没有怎么学习存储过程,只是看了一下存储过程的原理,就上手开发了(所谓了敏捷开发哈哈哈哈哈哈)
就引起我的疑问:是直接进入循环呢?还是先判断条件?
我上网查阅资料。。。好像没有查阅到额
不过看到有一个类型的,我贴出来
loop
v_sal := v_sal + 1;
dbms_output.put_line(v_sal);
exit when v_sal = 8000;
end loop
这个类比Java的do-while形式是一样的:先进入循环,满足条件了跳出循环
我就猜测
第一种也是这种类型的
于是我写了个测试例子,存储过程代码如下:
CREATE OR REPLACE PROCEDURE P_TEST(v_res OUT NUMBER,
v_errorCode OUT NVARCHAR2,
v_errorMsg OUT NVARCHAR2,
c_startDate IN NVARCHAR2) IS
c_firstMonthDay NVARCHAR2(10); -- 所在月的第一天
c_firstClearDate NVARCHAR2(10); -- 第一次生成的披露日期
c_clearDate NVARCHAR2(10); -- 披露日期
c_N NUMBER(10):=1; -- 计算使用的倍数,从0开始
BEGIN
--================================================================================
-------------------------------【执行sql文】--------------------------------------
--================================================================================
/* 期间管理报告清算提示 Start */
-- 开启日志输出缓冲
DBMS_OUTPUT.ENABLE(buffer_size => null);
-- 获取当月的第一天和最后一天
SELECT to_char(last_day(to_date(substr(c_startDate,0,7)||'-01', 'yyyy-mm-dd')), 'yyyy-mm-dd') INTO c_firstMonthDay FROM dual;
--SELECT to_char(to_date(substr(c_startDate,0,7)||'-01', 'yyyy-mm-dd'), 'yyyy-mm-dd') INTO c_lastMonthDay FROM dual;
c_N := 1;
-- 生成第一次提示日期
SELECT extract(YEAR FROM to_date(c_startDate, 'yyyy-mm-dd'))||'-'||'01'||'-'||'01'
INTO c_firstClearDate FROM dual;
c_clearDate := c_firstClearDate;
-- 披露日期小于系统日期生成期间管理报告清算提示
LOOP EXIT WHEN (c_clearDate > c_startDate);
-- 直接生成收益分配提示
dbms_output.put_line('披露日期为:' || c_clearDate);
dbms_output.put_line('传入日期为:' || c_startDate);
dbms_output.put_line('进入循环,说明首次进入循环不做条件判断');
-- 用第一次提示日期计算下一次的提示日期
SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'), c_N*12), 'yyyy-MM-')||'01' INTO c_clearDate FROM dual;
c_N := c_N + 1;
END LOOP;
/* 期间管理报告清算提示 End */
--输出放回状态信息
v_res := 0;
v_errorCode := SQLCODE;
v_errorMsg := 'P_TEST' || ':' || TO_CHAR(SQLERRM);
COMMIT;
--异常处理
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
v_res := -1;
v_errorCode := SQLCODE;
v_errorMsg := 'P_TEST' || ':' || TO_CHAR(SQLERRM);
END P_TEST;
编写完成,通过测试代码:
begin
-- Call the procedure
p_test(v_res => :v_res,
v_errorcode => :v_errorcode,
v_errormsg => :v_errormsg,
c_startdate => '2018-10-17');
end;
可以通过debug模式一步一步观察代码执行,
我把存储过程执行结果的日志贴出来

通过打印的日志也可以得出结论:先进入循环,当满足条件,跳出结束循环~
就OK的啦~~~~

存储过程关于LOOP循环问题的更多相关文章
- 四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程
数据库的设计(DataBase Design): 针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04 ...
- MySQL中的while、repeat、loop循环
循环一般在存储过程和存储函数中使用频繁,这里只给出最简单的示例 while delimiter $$ create procedure test_while() begin declare sum i ...
- Oracle之带参存储过程(存储过程中for循环调用存储过程)
--带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...
- oracle for loop循环以及游标循环
1. for in loop形式 DECLARE CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salar ...
- Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- PL/SQL中LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Oracle loop循环无法插入数据
以下的测试基于scott用户下的emp表 首先用while循环进行测试,向emp表插入999条数据 declare i emp.empno; begin loop insert into emp(em ...
- MySql 存储过程 光标只循环一次
[1]MqSql 存储过程 光标只循环一次 针对MySql存储过程,光标只循环一次就退出的场景,可能原因分析: (1)存储过程有问题(仔细检查语法.控制变量.条件等等) (2)保证存储过程正确.调用过 ...
- [转载]Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
随机推荐
- 关于ie8下监听input事件的不兼容问题。
关于在ie8下,监听输入框的值变化的input事件不支持的解决办法: 很懒...直接上原文地址.... 原文地址:http://www.cnblogs.com/lhb25/archive/2012/1 ...
- 解析oracle对select加锁的方法以及锁的查询 转
转自 https://www.jb51.net/article/37587.htm 本篇文章是对oracle对select加锁的方法以及锁的查询进行了详细的分析介绍,需要的朋友参考下 解析oracle ...
- How RTT works
13.2 How RTT works 13.2.1 Target implementation Real Time Terminal uses a SEGGER RTT Control Block s ...
- 清理 Xcode 10 记录
1,清理 ~/Library/Developer/CoreSimulator/Devices 说明:该目录存放当前的所有模拟器,每个标识符代表一台机器,清理掉避免存在旧版本的模拟器缓存 执行: 关闭模 ...
- 多线程编程初探——OO第二单元作业回顾
一.作业设计策略 1)执行FAFS策略的单部电梯 由于对多线程不是很了解,于是采用了理论课上介绍的生产者消费者模型作为设计模板(也是很多同学一开始的做法):将请求队列作为共享对象(托盘),名为In ...
- Java并发编程(八)线程间协作(上)
多线程并发执行时,不同的线程执行的内容之间可能存在一些依赖关系,比如线程一执行a()方法和c()方法,线程二执行b()方法,方法a()必须在方法b()之前执行,而方法c()必须在方法b()之后执行.这 ...
- [WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序
近日学习WCF,找了很多资料,终于找到了Artech这个不错的系列.希望能从中有所收获. 本文用于记录在学习和实践WCF过程中遇到的各种基础问题以及解决方法,以供日后回顾翻阅.可能这些问题都很基础,可 ...
- Ubuntu18.04安装mysql及相关配置
step 1: sudo apt-get update step 2: sudo apt-get install mysql-server step3: 查看mysql服务端是否开启 systemct ...
- jQuery实现全选、全不选以及反选操作
在写购物车案例时实现全选操作使用的是js的getAttribute()setAttribute()方法获取checked属性的值是undefined实现完成之后全选操作,如果在全选中的情况下改变其中一 ...
- Python -- Effective Python:编写高质量Python代码的59个有效方法
第 1 章 用 Pythonic 方式来思考 第 1 条:确认自己所用的 Python 版本 python --version import sys print(sys.version_info) p ...