精华内容
下载资源
问答
  • oracle存储过程continue

    千次阅读 2015-12-17 16:06:37
    在编写存储过程的过程中需要用到类似于Java循环中continue的功能,但是发现开发环境数据库安装的是oracle 10g并不支持continue语句,现场的测试库和正式库都是使用的11g,11g是支持continue语句的。  查看oracle的...

    在编写存储过程的过程中需要用到类似于Java循环中continue的功能,但是发现开发环境数据库安装的是oracle 10g并不支持continue语句,现场的测试库和正式库都是使用的11g,11g是支持continue语句的。exit用来跳出循环,并不能到下一次循环。return跳出存储过程

     查看oracle的版本信息 :用客户端连接到数据库,执行select * from v$instance 查看version项。
     

     这样在本地测试就需要单独编写一版存储过程,oracle 10g及以下使用goto来替代continue

    begin
        for i in 1..10 loop
          if mod(i,2)=0 then
            goto reapt point;
          end if;
          dbms_output.put_line(i); 
          <<reapt point>> ----要英文的两个尖括号
          null;
        end loop;
      end;
    <<reapt point>>标签后的null;语句不可少,因为goto标签后必须紧接着一个执行语句 
    或者自定义一个excption 来处理

    begin
       loop
      exit when ...
      declare
       ex exception;
      begin
        if .. then
        raise ex;
       end if;
      exception
        when ex then
         null;
      end;
    ...
    end loop;
    end;


    而正式环境只需要使用continue即可

    begin
        for i in 1..10 loop
          if mod(i,2)=0 then
            continue;
          end if;
          dbms_output.put_line(i); 
             end loop;
      end;



    展开全文
  • -- 开始循环,当遇到CONTINUE语句时,将重新开始LOOP的执行 DBMS_OUTPUT.put_line('内部循环值: x = ' || TO_CHAR(x)); x := x + 1; IF x < 3 THEN --如果计数器小于3,则重新开始执行循环。 CONTINUE...
  • 本文演示MySql 存储过程(procedure)中的continue和exit的区别。 1.建表 create table goods( id int, name varchar(20), num smallint ); 2.插入数据 insert into goods values(1,'cat',10),(2,'dog',5); 3...

        本文演示MySql 存储过程(procedure)中的continue和exit的区别。

    1.建表

    create table goods(
    id int,
    name varchar(20),
    num smallint
    );

    2.插入数据

    insert into goods values(1,'cat',10),(2,'dog',5);

    3.定义存储过程

    delimiter $$
    create procedure p10()
    begin
      declare s_id int;
      declare s_name varchar(20);
      declare s_num int;
    
      declare flag int default 1;
      declare getGoods cursor for select id,name,num from goods; -- 声明游标
      declare continue handler for NOT FOUND set flag := 0;     
      
      open getGoods; -- 打开游标
      repeat
        fetch getGoods into s_id,s_name,s_num;
        select s_id,s_name,s_num;
      until flag =0 end repeat;
      close getGoods; -- 关闭游标
    end $$
    delimiter ;

    4 执行存储过程

    mysql> call p10();
    +------+--------+-------+
    | s_id | s_name | s_num |
    +------+--------+-------+
    |    1 | cat    |    10 |
    +------+--------+-------+
    1 row in set (0.00 sec)
    
    +------+--------+-------+
    | s_id | s_name | s_num |
    +------+--------+-------+
    |    2 | dog    |     5 |
    +------+--------+-------+
    1 row in set (0.00 sec)
    
    +------+--------+-------+
    | s_id | s_name | s_num |
    +------+--------+-------+
    |    2 | dog    |     5 |
    +------+--------+-------+
    1 row in set (0.00 sec)
    

    5.问题分析

        数据库中只有2条数据,但是存储过程中却输出了3条记录,为什么?

       原因是定义存储过程时,使用了修饰符continue。

    declare continue handler for NOT FOUND set flag := 0; 

        第1条和第2条记录读取完毕后,再次在repeat循环中执行fetch语句时,会触发“NOT FOUND”事件,flag被置为0。

    fetch getGoods into s_id,s_name,s_num;

        但是由于声明了修饰符continue,此时程序并没有跳出repeat循环,而是继续执行下面的select语句

    select s_id,s_name,s_num;

        因此,第2条记录被输出了两次,共输出了3条记录。

    6.解决方案

       修饰符使用exit替换continue。exit会终止当前循环的执行,类似于c++中break的用法。

       更新存储过程的定义。

    declare exit handler for NOT FOUND set flag := 0;

        执行存储过程

    mysql> call p10();
    +------+--------+-------+
    | s_id | s_name | s_num |
    +------+--------+-------+
    |    1 | cat    |    10 |
    +------+--------+-------+
    1 row in set (0.00 sec)
    
    +------+--------+-------+
    | s_id | s_name | s_num |
    +------+--------+-------+
    |    2 | dog    |     5 |
    +------+--------+-------+
    1 row in set (0.00 sec)
    

        此时,输出的结果是正确的。

     

    展开全文
  • 存储过程:异常处理continue

    千次阅读 2012-08-20 14:21:13
    另一种就是我们将要演示的,CONTINUE处理, 它跟EXIT处理类似,不同在于它执行后,原主程序仍然继续运行 +------+------+ | @x | @x2 | +------+------+ | 3 | 1 | +------+------+ */
    drop table if exists t2;
    
    create table t2  
    (
    	s1 int, primary key (s1)
    	)  
    engine=innodb;
    
    delete from t2;
    
    drop procedure if exists p23;
    
    delimiter //
    
    create procedure p23()  
    begin  
     declare continue handler  
     for sqlstate '23000' set @x2 = 1;  
     
     set @x = 1;  
     insert into t2 values (1);  
     set @x = 2;  
     insert into t2 values (1);  
     set @x = 3;  
    end;//  
    
    delimiter ;
    
    call p23();
    
    select  @x, @x2;
    /*
    3000SQLSTATE是更常用的,当外键约束出错或主键约束出错就被调用了
    MySQL允许两种处理器,一种是EXIT处理,我们刚才所用的就是这种。另一种就是我们将要演示的,CONTINUE处理, 
    它跟EXIT处理类似,不同在于它执行后,原主程序仍然继续运行
    +------+------+
    | @x   | @x2  |
    +------+------+
    |    3 |    1 |
    +------+------+
    */

    展开全文
  • SQLServer编写存储过程中,我们会使用break、continue及return来中断程序的执行,这三者有什么区别,在此做以说明 break 退出 WHILE循环,执行循环体以后的语句,示例代码如下 declare @num int=10, @i int =0 ...

    SQLServer编写存储过程中,我们会使用break、continue及return来中断程序的执行,这三者有什么区别,在此做以说明

    break

    退出 WHILE循环,执行循环体以后的语句,示例代码如下

    declare @num int=10,
            @i int =0
    while(@i<@num)
      begin
        set @i = @i +1
        if(@i=5) 
          break
        print @i
      end
      print '执行完毕'
    

    执行结果为:
    0
    1
    2
    3
    4
    执行完毕
    当执行到@i=5时,跳出循环,继续执行循环体(end为标志)外语句

    continue

    满足条件的循环体内的以后语句不再执行,进入到下一个循环,示例代码如下

    declare @num int=10,
            @i int =0
    while(@i<@num)
      begin
        set @i = @i +1
        if(@i=5) 
          continue
        print @i
      end
      print '执行完毕'
    

    执行结果如下
    1
    2
    3
    4
    6
    7
    8
    9
    10
    执行完毕
    循环体内本次循环continue以后的语句不再执行,进入下一个循环

    return

    直接退出过程(存储过程或函数),示例代码如下:

    declare @num int=10,
            @i int =0
    while(@i<@num)
      begin
        set @i = @i +1
        if(@i=5) 
          return
        print @i
      end
      print '执行完毕'
    

    执行结果如下:
    1
    2
    3
    4
    执行到@i=5退出过程,循环体内满足条件以后的语句及循环体外的语句均不执行

    展开全文
  • 异常处理是存储过程里对各类错误异常进行捕获和自定义操作的机制,是有两种类型:exit——遇到错误就会退出执行后续的,continue——遇到错误会忽略错误继续执行后续。 下面举例说明:比如有一个存储过程p_insert_...
  • continue遇到错误会忽略错误继续执行 创建表的代码如下: CREATE TABLE `_t1`( `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `val1` VARCHAR(20) DEFAULT NULL, `varl2` INT(11) DEFAULT NULL )ENGINE=...
  • 各位db2存储过程大虾,有没有用过while do循环语句跳出当前循环继续下一个循环的方法啊?
  • 1、DECLARE EXIT HANDLER FOR SQLEXCEPTION 语句后面可以跟一个 begin end的复合语句块,也可以直接跟一个简单语句例如 :DECLARE EXIT HANDLER FOR SQLEXCEPTION v_succ=0;...CONTINUE选项会在异常后继续执行,从而...
  • sql存储过程

    2020-12-14 19:16:03
    以下存储过程可放在MySQL数据库的函数下即可: CREATE DEFINER=`root`@`%` PROCEDURE `deleteTenantAllData`( p_tenant_id BIGINT ) BEGIN DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR ...
  • sql 存储过程 并发测试 In this SQL Unit testing article, we will continue our journey with SQL unit testing. In the previous articles of this series (see the TOC at the bottom), we mentioned about ...
  • (1)存储过程 DROP PROCEDURE IF EXISTS proc_test; CREATE PROCEDURE proc_test() BEGIN DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; STAR...
  • 除了continue,exit外, 还有一种undo handler,
  • MySQL存储过程

    2012-05-31 15:02:58
    1,如果执行存储过程的时候出现 SQLECCEPTION 设置t_error = 1 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;    
  • 存储过程 备注

    2021-03-01 04:31:38
    delimiter // DROP PROCEDURE IF EXISTS test; CREATE PROCEDURE test() BEGIN DECLARE tem_id int; declare flag int default 0; DECLARE cnt INT DEFAULT 0;...declare continue handler for not fou
  • mysql 存储过程

    2019-10-01 00:25:53
    注意:定义参数的时候,不要将...show errors #显示错误DECLARE CONTINUE HANDLER for SQLEXCEPTION [sql] #出错了执行[sql],然后继续往下执行DECLARE EXIT HANDLER for SQLEXCEPTION [sql] #异常时仅执行[sql],停...
  • 2、选择过程——输入存储过程参数——完成(这一步可以不填写参数,编写存储过程代码的时候设置参数) 3、按照要求完成存储过程代码编写 1 BEGIN 2 DECLARE t_error INTEGER DEFAULT 0; 3 DECLARE ...
  • * 第9章 存储过程与触发器存储过程的使用 第25讲 SQL Server 2012 * * * * * * * * * * * * * * * * * 第9章 存储过程与触发器 存储...beginend语句 ifelse语句 whilebreak和continue语句 waitfor语句 第9章 存储过程
  • mysql存储过程异常

    2017-03-28 15:16:04
    有时候,不希望存储过程抛出错误中止执行,而是希望返回一个错误码。  MySQL 支持异常处理,通过定义 CONTINUE/EXIT 异常处理的 HANDLER   来捕获 SQLWARNING/NOT FOUND/SQLEXCEPTION (警告 / 无数据 / 其他...
  • MySQL存储过程示例

    2015-12-17 09:40:25
    写mysql存储过程应注意的几点: 1、声明变量(declare)时要注意字符集,用变量存储表字段时,表字段与变量的字符编码要一致。 2、mysql的字符合并不能用‘+’号,必须用concat函数。 3、每个游标必须使用...
  • 知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理:  条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤。  DECLARE CONTINUE HANDLER FOR SQLSTATE ...
  • 存储过程问题

    2015-11-02 10:55:00
    0 10:20:35 CREATE PROCEDURE pro_user4() BEGIN DECLARE a,b VARCHAR(20) ; DECLARE cur_t_user2 CURSOR FOR SELECT userName2,password2 FROM t_user2; DECLARE done INT DEFAULT FALSE; DECLARE CONTINUE...
  • mysql存储过程注意点

    2019-07-02 09:32:04
    mysql存储过程注意点1、select into null值问题使用游标时,select a into v_a,当记录不存在时,a为null,会触发NO_DATA_FOUND错误,使done=1,循环退出,如果不想退出循环,需要在select a into v_a后加上set done=...
  • 我们在使用储存过程中使用游标遍历数据的时候的基本写法如下: create procedure proc_test() sql security invoker begin declare p_id varchar(32); declare done tinyint default false; declare c_cur ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504
精华内容 201
关键字:

存储过程continue