本随笔文章,由个人博客(鸟不拉屎)转移至博客园

发布时间: 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循环问题的更多相关文章

  1. 四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程

    数据库的设计(DataBase Design): 针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04 ...

  2. MySQL中的while、repeat、loop循环

    循环一般在存储过程和存储函数中使用频繁,这里只给出最简单的示例 while delimiter $$ create procedure test_while() begin declare sum i ...

  3. Oracle之带参存储过程(存储过程中for循环调用存储过程)

    --带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...

  4. oracle for loop循环以及游标循环

    1. for in loop形式 DECLARE    CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salar ...

  5. Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  6. PL/SQL中LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  7. Oracle loop循环无法插入数据

    以下的测试基于scott用户下的emp表 首先用while循环进行测试,向emp表插入999条数据 declare i emp.empno; begin loop insert into emp(em ...

  8. MySql 存储过程 光标只循环一次

    [1]MqSql 存储过程 光标只循环一次 针对MySql存储过程,光标只循环一次就退出的场景,可能原因分析: (1)存储过程有问题(仔细检查语法.控制变量.条件等等) (2)保证存储过程正确.调用过 ...

  9. [转载]Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

随机推荐

  1. pdo_mysql扩展以及测试

    1.进入 PHP 的软件包 pdo 扩展目录中(注:php的tar包解压目录) 2.配置和编译文件 进入 在PHP源码包中进入 cd /data/php-5.6.36/ext/pdo_mysql 执行 ...

  2. cesium.js 设置缩放最大最小限制

    viewer.scene.screenSpaceCameraController.minimumZoomDistance = 1200;viewer.scene.screenSpaceCameraCo ...

  3. Activation Functions

    Sigmoid Sigmoids saturate and kill gradients. Sigmoid outputs are not zero-centered. Exponential fun ...

  4. 【luogu P2827 蚯蚓】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...

  5. VB.NET & Visual Basic

    当看到VB.NET者这本书籍的时候,翻开文件夹唯一的感受就是:这不和VB一样吗?究竟有什么差别呢? 1)版本号: 又一次回想VB,能够发现事实上他是Microsoft退出的基于Windows操作系统环 ...

  6. DG不同步,MRP0进程打不开

    问题描述:主库备库之前正常连接,但是昨天磁盘空间满了之后,由于不知什么原因将备库重做日志删了,今天早上发现DG不同步的报警. 当时思路如下:1.通过select thread#,low_sequenc ...

  7. eclipse 配置

    访问地址        https://www.eclipse.org/ . . . 配置工作目录:存放1.项目代码    2.IDE相关配置信息 //修改编码时的字体 //修改编码格式 没有配置to ...

  8. js之冒泡排序与快速排序

    //冒泡排序 let arr = [1, 6, 3, 7, 5, 9, 2, 8]; function sort(arr) { //升序 console.time("冒泡排序耗时" ...

  9. Redis数据库 : 基础

    设置密码: /etc/redis/redis.conf 文件把 requirepass 取消注释并设置密码 取消只能本地登录的bind 同上面的配置文件 把 bind一行注释掉 带密码登录: redi ...

  10. 需求:加一个下拉框选择条件改变饼图内外环 饼图:百度echarts提供

    1.1:下拉框条件:后台取得ViewBag传给前台 MonitorController: public ActionResult BigData(): //下拉框筛选条件 var result = M ...