• 存储过程goto用法
千次阅读
2019-04-26 14:50:10

原文：https://blog.csdn.net/IndexMan/article/details/19050419

一 定义：

属于plsql控制语句，用于程序控制非条件跳至指定标签<<???>>。不易控制和维护，慎用！

二 例子：

1、简单GOTO 语句，判断数字是否为质数：

DECLARE
p VARCHAR2(30);
n PLS_INTEGER := 37; -- test any integer > 2 for prime
BEGIN
FOR j IN 2 .. round(sqrt(n)) LOOP
IF n MOD j = 0 THEN
-- test for prime
p := ' is not a prime number'; -- not a prime number
GOTO print_now;
END IF;
END LOOP;
p := ' is a prime number';
<<print_now>>
dbms_output.put_line(to_char(n) || p);
END;


2、使用null避免报错：

DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1 .. 50 LOOP
IF done THEN
GOTO end_loop;
END IF;
<<end_loop>> -- not allowed unless an executable statement follows
NULL; -- add NULL statement to avoid error
END LOOP; -- raises an error without the previous NULL
END;


3、使用goto分出一个环绕块：

DECLARE
v_last_name VARCHAR2(25);
v_emp_id    NUMBER(6) := 120;
BEGIN
<<get_name>>
SELECT last_name
INTO v_last_name
FROM employees
WHERE employee_id = v_emp_id;
BEGIN
dbms_output.put_line(v_last_name);
v_emp_id := v_emp_id + 5;
IF v_emp_id < 120 THEN
GOTO get_name; -- branch to enclosing block
END IF;
END;
END;


底线

更多相关内容
• DELIMITER $$USE test$$DROP PROCEDURE IF EXISTS liangzi$$CREATE DEFINER=admin@% PROCEDURE liangzi(IN i INT)xiaoliangzi:BEGINIF i=1 THENSELECT 1;LEAVE xiaoliangzi;SELECT 'BBS';... DELIMITER$$

USE test$$DROP PROCEDURE IF EXISTS liangzi$$

CREATE DEFINER=admin@% PROCEDURE liangzi(IN i INT)

xiaoliangzi:BEGIN

IF i=1 THEN

SELECT 1;

LEAVE xiaoliangzi;

SELECT 'BBS';

ELSEIF i=2 THEN

SELECT 2;

LEAVE xiaoliangzi;

SELECT 'BBS';

ELSE

SELECT 3;

SELECT 'BBS';

END IF;

SELECT 'BLOG.51CTO.COM';

END

DELIMITER ;

-- ------------------------------------------

mysql> call liangzi(2);

+---+

| 2 |

+---+

| 2 |

+---+

1 row in set (0.00 sec)

-- ------------------------------------------

mysql> call liangzi(3);

+---+

| 3 |

+---+

| 3 |

+---+

1 row in set (0.00 sec)

+-----+

| BBS |

+-----+

| BBS |

+-----+

1 row in set (0.00 sec)

+----------------+

| BLOG.51CTO.COM |

+----------------+

| BLOG.51CTO.COM |

+----------------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

-- ------------------------------------------

mysql> call liangzi(4);

+---+

| 3 |

+---+

| 3 |

+---+

1 row in set (0.00 sec)

+-----+

| BBS |

+-----+

| BBS |

+-----+

1 row in set (0.00 sec)

+----------------+

| BLOG.51CTO.COM |

+----------------+

| BLOG.51CTO.COM |

+----------------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

展开全文
• 1. 条件分支IF-THEN-ELSE-END IF 1 CREATE PROCEDURE p12 (IN parameter1 INT)2 ... 虽然不是标准的SQL语句,MySQL的存储过程中仍然可以使用GOTO语句,此处标号的使用与前面不同,出于和其他DBMS兼容,此处用法慢慢被淘汰.

1. 条件分支IF-THEN-ELSE-END IF

1 CREATE PROCEDURE p12 (IN parameter1 INT)2 BEGIN

3 DECLARE variable1 INT;4 SET variable1 = parameter1 + 1;5 IF variable1 = 0 THEN

6 INSERT INTO t VALUES (17);7 END IF;8 IF parameter1 = 0 THEN

9 UPDATE t SET s1 = s1 + 1;10 ELSE

11 UPDATE t SET s1 = s1 + 2;12 END IF;13 END; //

2. CASE指令

1 CREATE PROCEDURE p13 (IN parameter1 INT)2 BEGIN

3 DECLARE variable1 INT;4 SET variable1 = parameter1 + 1;5 CASEvariable16 WHEN 0 THEN

7 INSERT INTO t VALUES (17);8 WHEN 1 THEN

9 INSERT INTO t VALUES (18);10 ELSE

11 INSERT INTO t VALUES (19);12 END CASE;13 END; //

3. Loops循环

1) WHILE...END WHILE

1 CREATE PROCEDUREp14 ()2 BEGIN3 DECLARE v INT;4 SET v = 0;5 WHILE v

2) REPEAT...END REPEAT

1 CREATE PROCEDUREp15 ()2 BEGIN

3 DECLARE v INT;4 SET v = 0;5 REPEAT6 INSERT INTO t VALUES(v);7 SET v = v + 1;8 UNTIL v >= 5 /*此处引号可省,也可不写*/

9 ENDREPEAT;10 END; //

3) LOOP...END LOOP

1 CREATE PROCEDUREp16 ()2 BEGIN

3 DECLARE v INT;4 SET v = 0;5 loop_label: LOOP6 INSERT INTO t VALUES(v);7 SET v = v + 1;8 IF v >= 5 THEN

9 LEAVE loop_label;10 END IF;11 ENDLOOP;12 END; //

a. LOOP循环与WHILE相似,不需要初始条件,同时又与REPEAT循环一样没有结束条件.在循环开始的loop_label:用于标识该循环,而IF结构里的LEAVE loop_label表示离开循环.

b. Labels标号可用在BEGIN,WHILE,REPEAT或者LOOP之前,语句标号只能在合法的语句前使用,所以,LEAVE 意味着离开与该标号对应的语句或复合语句:

1 CREATE PROCEDUREp17 ()2 label_1: BEGIN

3 label_2: WHILE 0 = 1DO4 LEAVE label_2;5 END WHILE;6 label_3: REPEAT7 LEAVE label_3;8 UNTIL 0 =0

9 ENDREPEAT;10 label_4: LOOP11 LEAVE label_4;12 ENDLOOP;13 END; //

c. End Labels标号结束符,可以用在在由标号定义的语句结束之后,无功能性作用,只起到说明的作用:

1 CREATE PROCEDUREp18 ()2 label_1: BEGIN

3 label_2: WHILE 0 = 1DO4 LEAVE label_2;5 END WHILElabel_2;6 label_3: REPEAT7 LEAVE label_3;8 UNTIL 0 =0

9 ENDREPEAT label_310 label_4: LOOP11 LEAVE label_4;12 ENDLOOP label_413 END label_1 //

d. LEAVE and Labels:LEAVE语句使程序跳出复杂的复合语句:

1 CREATE PROCEDURE p19 (parameter1 CHAR)2 label_1: BEGIN

3 label_2: BEGIN

4 label_3: BEGIN

5 IF parameter1 IS NOT NULL THEN

6 IF parameter1 = 'a' THEN

7 LEAVE label_1;8 ELSE

9 BEGIN

10 IF parameter1 = 'b' THEN

11 LEAVE label_2;12 ELSE

13 LEAVE label_3;14 END IF;15 END;16 END IF;17 END IF;18 END;19 END;20 END;//

e. ITERATE迭代:如果目标是迭代语句,就必须用到LEAVE语句,ITERATE和LEAVE语句一样可以在循环内部使用,类似c语言的continue:

1 CREATE PROCEDUREp20 ()2 BEGIN

3 DECLARE v INT;4 SET v = 0;5 loop_label: LOOP6 IF v = 3 THEN

7 SET v = v + 1;8 ITERATE loop_label;9 END IF;10 INSERT INTO t VALUES(v);11 SET v = v + 1;12 IF v >= 5 THEN

13 LEAVE loop_label;14 END IF;15 ENDLOOP;16 END; //

4) GOTO

1 CREATE PROCEDUREp...2 BEGIN

3 ...4 LABEL label_name;5 ...6 GOTOlabel_name;7 ...8 END;

虽然不是标准的SQL语句,MySQL的存储过程中仍然可以使用GOTO语句,此处标号的使用与前面不同,出于和其他DBMS兼容,此处用法慢慢被淘汰.

展开全文
• 今天分享下自己对于Mysql存储过程的认识与了解,这里主要说说大家常用的游标加循环的嵌套使用
• 主要介绍了循环和游标在Sql存储过程使用及sql如何使用cursor写一个简单的循环的相关资料,需要的朋友可以参考下
• /*–用存储过程实现的分页程序 显示指定表、视图、查询结果的第X页 对于表中主键或标识列的情况,直接从原表取数查询，其它情况使用临时表的方法 如果视图或查询结果中有主键,不推荐此方法 –邹建 2003.09–*/ /*–...
• oracle存储过程中入参是逗号分隔，并且参数要使用在in过滤语句中查询数据。处理的方法与实现
• 使用SELECT …INTO语句为变量赋值在MySQL存储过程中，可以使用SELECT …INTO语句对变量进行赋值，该语句在数据库中进行查询，并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下：SELECTcol_name[,...]...

使用SELECT …INTO语句为变量赋值

在MySQL存储过程中，可以使用SELECT …INTO语句对变量进行赋值，该语句在数据库中进行查询，并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下：

SELECT col_name[,...] INTO var_name[,...] table_expr

col_name：要从数据库中查询的列字段名；

var_name：变量名，列字段名按照在列清单和变量清单中的位置对应，将查询得到的值赋给对应位置的变量；

table_expr：SELECT语句中的其余部分，包括可选的FROM子句和WHERE子句。

需要注意的是，在使用SELECT …INTO语句时，变量名不能和数据表中的字段名不能相同，否则会出错。范例语句：

create procedure getMsg

()

Begin

declare v_title varchar(30);

declare v_content varchar(100);

select title,content into v_title,v_content from news where artId=333;

End

将变量值返回给调用者

在存储过程中定义的变量，经过一系列的处理之后，结果值可能需要返回给存储过程调用者。那么如何返回呢？方便的做法是使用SELECT语句将变量作为结果集返回，因此，在上面一段代码的基础上，加上一句：

create procedure getMsg

()

Begin

declare v_title varchar(30);

declare v_content varchar(100);

select title,content into v_title,v_content from news where artId=333;

select v_title,v_content;

End

【转载】Sqlserver存储过程中使用Select和Set给变量赋值

Sqlserver存储过程是时常使用到的一个数据库对象,在存储过程中会使用到Declare来定义存储过程变量,定义的存储过程变量可以通过Set或者Select等关键字方法来进行赋值操作,使用Set对存 ...

mysql 存储过程中使用动态sql语句

Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值 这里介绍两种在存储过程中的动态sql: set sql = (预处理的sql语句,可以是用concat拼接的 ...

存储过程中使用select……into

在MySQL存储过程中使用SELECT -INTO语句为变量赋值: 用来将查询返回的一行的各个列值保存到局部变量中. 要求: 查询的结果集中只能有1行. SELECT col_name[,...] I ...

mysql 存储过程中limit

1.mysql的高版本(5.5),存储过程中的limit可以使用变量,如下:select * from student limit iStart,iNum; 2.mysql的低版本(5.1),存储过程 ...

【转】MySQL存储过程中使用动态行转列

MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

mysql -- 存储过程中 declare 和 set 定义变量的区别

mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...

MySQL存储过程中的3种循环&comma;存储过程的基本语法&comma;ORACLE与MYSQL的存储过程&sol;函数的使用区别，退出存储过程方法

在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...

MYSQL存储过程中常使用的命令记录

MYSQL存储过程中常使用的命令记录 1.触发器trigger 查看:show triggers; 2.存储过程procedure 查看:show procedure status; 查看详细:sho ...

MYSQL存储过程中的IN、OUT和INOUT

MYSQL存储过程中的IN.OUT和INOUT,不能简单理解为一个方法的参数和返回值,而是面向整个过程上下文变量的. 一.MySQL 存储过程参数(in) 基本可以理解为传入function的参数,而 ...

随机推荐

JAVA&lowbar;build&lowbar;ant&lowbar;FixCRLF

Description Adjusts a text file to local conventions. The set of files to be adjusted can be refined ...

hdoj 1247 Hat’s Words&lpar;字典树&rpar;

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 思路分析:题目要求找出在输入字符串中的满足要求(该字符串由输入的字符串中的两个字符串拼接而成)的 ...

量化投资技术分析工具---ipython使用

量化投资实际上就是分析数据从而做出决策的过程python数据处理相关模块NumPy:数组批量计算pandas:灵活的表计算Matplotlib:数据可视化 学习目标:用NumPy+pandas+Mat ...

Beta冲刺4&sol;7

目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

mysql 索引查询 、创建 create index 与 add index 的区别

1.索引查询 ------TABLE_SCHEMA  库名:TABLE  表名 ------AND UPPER(INDEX_NAME) != 'PRIMARY'  只查询索引,不需要主键 SELECT ...

GridView不执行RowCommand事件

web.config里把viewstate禁用了.如果是的话在页面里单独开起来就好了.

Java 图形化界面设计(GUI)实战练习(代码)

关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...

phpstorm 2017版代码提示功能开启解决方案

安装好phpstorm 2017之后 发现代码高亮和函数自动提示都失效了 在phpstorm底部面板的信息提示处发现有一条系统消息: 12:04:18 Power save mode is on Co ...

使用uGUI系统玩转标准俄罗斯方块

使用uGUI系统玩转标准俄罗斯方块 笔者使用的Unity3D版本是4.6b17.由于一些工作上的一些事情导致制作的进度被严重滞后.笔者实际用于开发俄罗斯方块的时间,大概也就2-3天吧. 开始前的准备 ...

SynchronizationContext应用

这个类的应用,官方的说明并不是很多,主要原因是因为微软又出了一些基于SynchronizationContext的类.比如:BackgroundWorker 大家写程序时经常碰到子线程调用UI线程的方 ...

展开全文
• GOTO命令用来改变程序执行的流程，使程序跳到标识符指定的程序行再继续往下执行。语法：GOTO 标识符标识符需要在其名称后加上一个冒号“：”。例如：“33：”，“loving：。SQL语句如下：DECLARE @X INTSELECT @X=1...
• 游标游标(Cursor)是处理数据的一种方法，为了查看或者处理结果集中的数据，游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。使用步骤声明一个游标: declare 游标名称 CURSOR for table;(这里的table...
• 在这部分，主要讲解一些简单的问题、异常处理器和条件。...2、下面做一个例子，创建一个主键表，一个外键表，在mysql中由于使用了InnoDB存储引擎，所以外键关联检查是打开的，所以向外键表中插入非主键表的...
• Oracle 数据库的PLSQL块，游标、函数，存储过程与触发器的使用方法与案例
• 如果某次操作需要执行多次SQL，使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。优点1、存储过程因为SQL语句已经预编绎过了，因此运行的速度比较快。2、可保证数据的安全性和完整性。通过...
• Oracle的存储过程，是我们使用数据库应用开发的重要工具手段。在存储过程中，我们大部分应用场景都是使用DML语句进行数据增删改操作。本篇中，我们一起探讨一下数据定义语句DDL在存储过程使用的细节和要点。1、...
• oracle存储过程—-存储过程游标(cursor）、遍历的使用方法   今天又学了一个新的概念Cursor ，即游标。   接上一篇，oracle存储过程—-存储过程执行简单的增删改查sql ，上一篇中，写到存储过程的查询sql ，...
• 引用：百度百科存储过程存储过程(Stored Procedure)是在大型数据库系统中，一组为了完成特定功能的...注意：本文主要简述mysql中存储过程使用，其他数据库可能有所出入。存储过程的好处：1.由于数据库执行动作时，...
• 记录exit和return的用法exit用来跳出循环loopIF...return跳出存储过程loopIF V_KBP IS NULL THENreturn;END IF;end loop;跳出loop 一次循环oracle 11g已提供continue;oracle 10g及以下,使用goto来替代,例如SQL> s...
• Mysql储存过程是一组为了完成特定功能的SQL语句集，经过编译之后存储在数据库中，当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了，简而言之就是一组已经写好的命令，需要...
• 第一种 如果你使用 PL/SQL Developer工具左侧工具栏中选择“存储过程”-》选择已经失效的procedure-》右键-》选择重新编译 即可完成第二种 命令行版1.查找到无效对象select 'Alter '||object_type||' '||object_name...
• 数据库实验六：数据可存储过程和触发器定义和使用相关实验试题及代码
• 1.return：不再继续下面的代码，立即结束；运行到return就结束，后面的语句不会被执行： 例子： 代码： 执行结果： 2.设置断点； 3.return：退出整个程序 ...goto xxxx：跳转到标记所在位置 ...
• 本文简单记录下oracle数据库中，如何用plsql编程、以及存储过程的创建和使用。 相关的概念我就不列举了，大家不清楚的可以自行搜索，本篇主要列举实际的sql语法。 那plsql编程，大家可以使用windows的命令行，也可以...
• ## Oracle中GOTO的用法

千次阅读 2013-12-03 14:37:31
Oracle中没有continue关键字，在loop中可以用goto语句实现同样的效果。 create or replace procedure dd is i pls_integer; begin i := 0; loop &lt;&lt;top&gt;&gt; i := i + 1; ...
• 本文简单记录下oracle数据库中，如何用plsql编程、以及存储过程的创建和使用。 相关的概念我就不列举了，大家不清楚的可以自行搜索，本篇主要列举实际的sql语法。 那plsql编程，大家可以使用windows的命令行，也...
• MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别，退出存储过程方法   在MySQL存储过程的语句中有三个标准的循环方式：WHILE循环，LOOP循环以及REPEAT循环。还有一种非标准...
• 存储过程优缺点： 优点： 1）可以执行复杂的业务场景， 2）重复调用，不用重新编译sql， 3) 维护性好，直接改存储过程语句即可 等等 缺点： 1）开发调试复杂不方便， 2）可移植性差：在不同...

...