精华内容
下载资源
问答
  • 存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。  ——————–基本语法——————–  一.创建存储过程  create procedure sp_name()  begin  ………  ...
  • MySQL在执行存储过程时sql没问题,但提示语法错误。。。。。 MySQL执行存储过程时 ; 号会被mysql认为结束了导致语句不完整因此报错 解决办法: 使用DELIMITER声明结束符为//或者其他 在create之前定义为//,end之后再...

    MySQL在执行存储过程时sql没问题,但提示语法错误。。。。。

    MySQL执行存储过程时 ; 号会被mysql认为结束了导致语句不完整因此报错
    解决办法:
    使用DELIMITER声明结束符为//或者其他
    在create之前定义为//,end之后再定义成;
    DELIMITER //
    create

    end // (这里注意end和//之间加空格)
    DELIMITER ;

    问题解决

    展开全文
  • MySQL 存储过程详解

    2017-07-21 16:34:38
    MySQL 存储过程详解
  • mysql存储过程语法大全

    千次阅读 2016-02-24 11:46:07
    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#flow-control-constructs ...第20章:存储程序和函数 ...20.1. 存储程序和授权表...20.2. 存储程序的语法 20.2.1. CREATE PROCEDURE和CREATE
    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#flow-control-constructs


    第20章:存储程序和函数

    20.2. 存储程序的语法

    MySQL 5.1版支持存储程序和函数。一个存储程序是可以被存储在服务器中的一套SQL语句。一旦它被存储了,客户端不需要再重新发布单独的语句,而是可以引用存储程序来替代

    下面一些情况下存储程序尤其有用:

    ·         当用不同语言编写多客户应用程序,或多客户应用程序在不同平台上运行且需要执行相同的数据库操作之时。

    ·         安全极为重要之时。比如,银行对所有普通操作使用存储程序。这提供一个坚固而安全的环境,程序可以确保每一个操作都被妥善记入日志。在这样一个设置中,应用程序和用户不可能直接访问数据库表,但是仅可以执行指定的存储程序

    储程序可以提供改良后的性能,因为只有较少的信息需要在服务器和客户算之间传送。代价是增加数据库服务器系统的负荷,因为更多的工作在服务器这边完成,更少的在客户端(应用程序)那边完成上。如果许多客户端机器(比如网页服务器)只由一个或少数几个数据库服务器提供服务,可以考虑一下存储程序。

    存储程序也允许你在数据库服务器上有函数库。这是一个被现代应用程序语言共享的特征,它允许这样的内部设计,比如通过使用类。使用这些客户端应用程序语言特征对甚至于数据库使用范围以外的编程人员都有好处。

    MySQL为存储程序遵循SQL:2003语法,这个语法也被用在IBM的DB2数据库上。

    MySQL对存储程序的实现还在进度中。所有本章叙述的语法都被支持,在有限制或扩展的地方会恰当地指出来。有关使用 存储程序的限制的更多讨论在附录 I, 特性限制里提到。

    20.4节,“存储子程序和触发程序的二进制日志功能”里所说的, 存储子程序的二进制日志功能已经完成。

    20.1. 存储程序和授权表

    存储程序需要在mysql数据库中有proc表。这个表在MySQL 5.1安装过程中创建。如果你从早期的版本升级到MySQL 5.1 ,请确定更新你的授权表以确保proc表的存在。请参阅2.10.2节 “升级授权表”

    在MySQL 5.1中,授权系统如下考虑存储子程序:

    ·         创建存储子程序需要CREATE ROUTINE权限。

    ·         提醒或移除存储子程序需要ALTER ROUTINE权限。这个权限自动授予子程序的创建者。

    ·         执行子程序需要EXECUTE权限。然而,这个权限自动授予 子程序的创建者。同样,子程序默认的SQL SECURITY 特征是DEFINER,它允许用该子程序访问数据库的用户与执行子程序联系到一起。

    20.2. 存储程序的语法

    存储程序和函数是用CREATE PROCEDURE和CREATE FUNCTION语句创建的子程序。一个子程序要么是一个程序要么是一个函数。使用CALL语句来调用 程序,程序只能用输出变量传回值。就像别其它函数调用一样,函数可以被从语句外调用(即通过引用函数名),函数能返回标量值。 存储子程序也可以调用其它存储子程序。

    在MySQL 5.1中,一个存储子程序或函数与特定的数据库相联系。这里有几个意思:

    ·         当一个子程序被调用时,一个隐含的USE db_name 被执行(当子程序终止时停止执行)。存储子程序内的USE语句时不允许的。

    ·         你可以使用数据库名限定子程序名。这可以被用来引用一个不在当前数据库中的子程序。比如,要引用一个与test数据库关联的存储程序p或函数f,你可以说CALL test.p()或test.f()。

    ·         数据库移除的时候,与它关联的所有存储子程序也都被移除。

    MySQL 支持非常有用的扩展,即它允许在存储程序中使用常规的SELECT语句(那就是说,不使用光标或 局部变量)。这个一个查询的结果包被简单地直接送到客户端。多SELECT语句生成多个结果包,所以客户端必须使用支持多结果包的MySQL客户端库。这意味这客户端必须 使用至少MySQL 4.1以来的近期版本上的客户端库。

    下面一节描述用来创建,改变,移除和查询存储程序和函数的语法。

    20.2.1CREATE PROCEDURECREATE FUNCTION

    CREATE PROCEDURE sp_name ([proc_parameter[,...]])
    
        [characteristic ...] routine_body
    
     
    
    CREATE FUNCTION sp_name ([func_parameter[,...]])
    
        RETURNS type
    
        [characteristic ...] routine_body
    
        
    
        proc_parameter:
    
        [ IN | OUT | INOUT ] param_name type
    
        
    
        func_parameter:
    
        param_name type
    
     
    
    type:
    
        Any valid MySQL data type
    
     
    
    characteristic:
    
        LANGUAGE SQL
    
      | [NOT] DETERMINISTIC
    
      | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    
      | SQL SECURITY { DEFINER | INVOKER }
    
      | COMMENT 'string'
    
     
    
    routine_body:
    
        Valid SQL procedure statement or statements
    

    这些语句创建存储子程序。要在MySQL 5.1中创建子程序,必须具有CREATE ROUTINE权限,并且ALTER ROUTINE和EXECUTE权限被自动授予它的创建者。如果二进制日志功能被允许,你也可能需要SUPER权限,请参阅20.4节“存储子程序和触发程序的二进制日志功能”

    默认地,子程序与当前数据库关联。要明确地把子程序与一个给定数据库关联起来,可以在创建子程序的时候指定其名字为db_name.sp_name

    如果子程序名和内建的SQL函数名一样,定义子程序时,你需要在这个名字和随后括号中间插入一个空格,否则发生语法错误。当你随后调用子程序的时候也要插入。为此,即使有可能出现这种情况,我们还是建议最好避免给你自己的 存储子程序取与存在的SQL函数一样的名字。

    由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数 默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词 OUT或INOUT

    注意: 指定参数为IN, OUT, 或INOUT 只对PROCEDURE是合法的。(FUNCTION参数总是被认为是IN参数)

    RETURNS字句只能对FUNCTION指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

    routine_body 包含合法的SQL过程语句。可以使用复合语句语法,请参阅20.2.7节,“BEGIN ... END复合语句。复合语句可以包含 声明,循环和其它控制结构语句。这些语句的语法在本章后免介绍,举例,请参阅20.2.8节,“DECLARE语句20.2.12节,“流程控制构造”

    CREATE FUNCTION语句被用在更早的MySQL版本上支持UDF (自定义函数)。请参阅27.2节,“给MySQL添加新函数”。 UDF继续被支持,即使现在 有了存储函数。UDF会被认为一个外部存储函数。然而,不要让存储函数与UDF函数共享名字空间。

    外部存储程序的框架将在不久的将来引入。这将允许你用SQL之外的语言编写存储程序。最可能的是,第一个被支持语言是PHP,因为核心PHP引擎很小,线程安全,且可以被方便地嵌入。因为框架是公开的,它希望许多其它语言也能被支持。

    如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定的”,否则就是“非确定”的。如果既没有给定DETERMINISTIC也没有给定NOT DETERMINISTIC,默认的就是NOT DETERMINISTIC。

    为进行复制,使用NOW()函数(或它的同义词)或RAND()函数会不必要地使得一个子程序非确定。对NOW()而言,二进制日志包括时间戳并被正确复制。RAND() 只要在一个子程序被内应用一次也会被正确复制。(你可以把子程序执行时间戳和随机数种子认为强制输入,它们在主从上是同样的。)

    当前来讲,DETERMINISTIC特征被接受,但还没有被优化程序所使用。然而如果二进制日志功能被允许了,这个特征影响到MySQL是否会接受子程序定义。请参阅20.4,“存储子程序和触发程序的二进制日志功能”

    一些特征提供子程序使用数据的内在信息。CONTAINS SQL表示子程序不包含读或写数据的语句。NO SQL表示子程序不包含SQL语句。READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。MODIFIES SQL DATA表示子程序包含写数据的语句。如果这些特征没有明确给定,默认的是CONTAINS SQL。

    SQL SECURITY特征可以用来指定 子程序该用创建子程序者的许可来执行,还是使用调用者的许可来执行。默认值是DEFINER。在SQL:2003中者是一个新特性。创建者或调用者必须由访问 子程序关联的数据库的许可。在MySQL 5.1中,必须有EXECUTE权限才能执行子程序。必须拥有这个权限的用户要么是定义者,要么是调用者,这取决于SQL SECURITY特征是如何设置的。

    MySQL存储sql_mode系统变量设置,这个设置在子程序被创建的时候起作用,MySQL总是强制使用这个设置来执行 子程序。

    COMMENT子句是一个MySQL的扩展,它可以被用来描述 存储程序。这个信息被SHOW CREATE PROCEDURE和 SHOW CREATE FUNCTION语句来显示。

    MySQL允许子程序包含DDL语句,如CREATE和DROP。MySQL也允许存储程序(但不是 存储函数)包含SQL 交互语句,如COMMIT。存储函数不可以包含那些做明确的和绝对的提交或者做回滚的语。SQL标准不要求对这些语句的支持,SQL标准声明每个DBMS提供商可以决定是否允许支持这些语句。

    存储子程序不能使用LOAD DATA INFILE。

    返回结果包的语句不能被用在存储函数种。这包括不使用INTO给变量读取 列值的SELECT语句,SHOW 语句,及其它诸如EXPLAIN这样的语句。对于可在函数定义时间被决定要返回一个结果包的语句,发生一个允许从函数错误返回结果包的Not(ER_SP_NO_RETSET_IN_FUNC)。对于只可在运行时决定要返回一个结果包的语句, 发生一个不能在给定上下文错误返回结果包的PROCEDURE %s (ER_SP_BADSELECT)。

    下面是一个使用OUT参数的简单的存储程序的例子。例子为,在 程序被定义的时候,用mysql客户端delimiter命令来把语句定界符从 ;变为//。这就允许用在 程序体中的;定界符被传递到服务器而不是被mysql自己来解释。

    mysql> delimiter //
    
     
    
    mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    
        -> BEGIN
    
        ->   SELECT COUNT(*) INTO param1 FROM t;
    
        -> END
    
        -> //
    
    Query OK, 0 rows affected (0.00 sec)
    
     
    
    mysql> delimiter ;
    
     
    
    mysql> CALL simpleproc(@a);
    
    Query OK, 0 rows affected (0.00 sec)
    
     
    
    mysql> SELECT @a;
    
    +------+
    
    | @a   |
    
    +------+
    
    | 3    |
    
    +------+
    
    1 row in set (0.00 sec)
    

    当使用delimiter命令时,你应该避免使用反斜杠(\)字符,因为那是MySQL的 转义字符。

    下列是一个例子,一个采用参数的函数使用一个SQL函数执行一个操作,并返回结果:

    mysql> delimiter //
    
     
    
    mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
    
        -> RETURN CONCAT('Hello, ',s,'!');
    
        -> //
    
    Query OK, 0 rows affected (0.00 sec)
    
     
    
    mysql> delimiter ;
    
     
    
    mysql> SELECT hello('world');
    
    +----------------+
    
    | hello('world') |
    
    +----------------+
    
    | Hello, world!  |
    
    +----------------+
    
    1 row in set (0.00 sec)
    

    如果在存储函数中的RETURN语句返回一个类型不同于在函数的RETURNS子句中指定类型的值,返回值被强制为恰当的类型。比如,如果一个函数返回一个ENUM或SET值,但是RETURN语句返回一个整数,对于SET成员集的相应的ENUM成员,从函数返回的值是字符串。

    20.2.2. ALTER PROCEDUREALTER FUNCTION

    ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
    
     
    
    characteristic:
    
        { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    
      | SQL SECURITY { DEFINER | INVOKER }
    
      | COMMENT 'string'
    

    这个语句可以被用来改变一个存储程序或函数的特征。在MySQL 5.1中,你必须用ALTER ROUTINE权限才可用此子程序。这个权限被自动授予子程序的创建者。如20.4节,“存储子程序和触发程序的二进制日志功能”中所述, 如果二进制日志功能被允许了,你可能也需要SUPER权限。

    在ALTER PROCEDURE和ALTER FUNCTION语句中,可以指定超过一个的改变。

    下面还有很多看官方网站吧。。。

    展开全文
  • MYSQL存储过程,有想了解的可以看看加深理解,有例子可看
  • Mysql存储过程基本语法

    千次阅读 2019-01-18 23:47:51
    Mysql 存储过程基本语法 转载自这篇文章 delimiter // 一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。 一.创建存储过程 1....

    Mysql 存储过程基本语法

    转载自这篇文章

    delimiter //
    一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。

    一.创建存储过程

    1.基本语法:

    create procedure sp_name()
    begin
    .........
    end

    2.参数传递

    二.调用存储过程

    1.基本语法:call sp_name()
    注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

    三.删除存储过程

    1.基本语法:
    drop procedure sp_name//
    2.注意事项
    (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

    四.区块,条件,循环

    1.区块定义,常用
    begin
    ......
    end;
    也可以给区块起别名,如:
    lable:begin
    ...........
    end lable;
    可以用leave lable;跳出区块,执行区块以后的代码
    2.条件语句

    if 条件 then
    statement
    else
    statement
    end if;


    3.循环语句
    (1).while循环

    [label:] WHILE expression DO

    statements

    END WHILE [label] ;

     

    (2).loop循环

    [label:] LOOP

    statements

    END LOOP [label];

    (3).repeat until循环

    [label:] REPEAT

    statements

    UNTIL expression

    END REPEAT [label] ;

    五.其他常用命令

    1.show procedure status
    显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
    2.show create procedure sp_name
    显示某一个存储过程的详细信息

    下面看一个例子

    一、MySQL 创建存储过程

    “pr_add” 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和

    delimiter //   -- 改变分割符

    drop procedure if exists pr_add//  -- 若之前创建有这个存储过程则删除

    计算两个数之和

    1. create procedure pr_add (a int,b int)
    2. begin
    3. declare c int;
    4. if a is null then
    5. set a = 0;
    6. end if;
    7. if b is null then
    8. set b = 0;
    9. end if;
    10. set c = a + b;
    11. select c as sum;
    12. end
    13. //

    二、调用 MySQL 存储过程

    1. call pr_add(10, 20);

    执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。

    1. set @a = 10;
    2. set @b = 20;
    3. call pr_add(@a, @b);

    三、MySQL 存储过程特点

    创建 MySQL 存储过程的简单语法为:

    1. create procedure 存储过程名字()
    2. (
    3. [in|out|inout] 参数 datatype
    4. )
    5. begin
    6. MySQL 语句;
    7. end;

    MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。

    1. MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”

    2. MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。

    1. create procedure pr_add
    2. (
    3. @a int, -- 错误
    4. b int -- 正确
    5. )

    3. MySQL 存储过程的参数不能指定默认值。

    4. MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字。

    1. create procedure pr_add
    2. (
    3. a int,
    4. b int
    5. )
    6. as -- 错误,MySQL 不需要 “as”
    7. begin
    8. mysql statement ...;
    9. end;

    5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。

    1. create procedure pr_add
    2. (
    3. a int,
    4. b int
    5. )
    6. begin
    7. mysql statement 1 ...;
    8. mysql statement 2 ...;
    9. end;

    6. MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”

    1. ...
    2. declare c int;
    3. if a is null then
    4. set a = 0;
    5. end if;
    6. ...
    7. end;

    7. MySQL 存储过程中的注释。

    1. declare c int; -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)
    2. if a is null then # 这也是个单行 MySQL 注释
    3. set a = 0;
    4. end if;
    5. ...
    6. end;

    8. 不能在 MySQL 存储过程中使用 “return” 关键字。

    1. set c = a + b;
    2. select c as sum;
    3. end;

    9. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”

    1. call pr_no_param();

    10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。

    展开全文
  • MySQL 存储过程 基本语法

    万次阅读 2018-07-11 17:09:55
    如果mysql 相对存储过程进行断点调试 可以使用dbforge studio for mysql 进行断点调试 注意点: select ** into ** 如果没有查询到值,那么游标会跳出循环 必须加判断 IF(EXISTS(select 1 from offline o where o....

    DECLARE 用来定义变量: DECLARE + 变量名 + 数据类型(数据长度)

    对于 DECLARE  定义的变量赋值 有2种方式

    set 变量名 = 值 注意 set 赋值时,如果是sql 语句,sql语句必须用括号括起来

    select   ** into **

    set 值可以对一个变量进行赋值

    select ** into ** 可以对 多个变量进行赋值

    如果在sql需要对查询出来的多条数据进行循环,需要用游标来处理

    DECLARE done BOOLEAN DEFAULT 0;  -- 定义一个变量,只有当游标到底时,才会改变
    DECLARE dev_rs CURSOR FOR select device_id from device; -- 定义游标 并把值存在游标里
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  -- 把结束标志 绑定到游标上

    定义事务

      

    DECLARE t_error INTEGER DEFAULT 0; -- 定义一个变量 ,只有当执行出错时, 才会改变变量值

     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
     IF t_error = 0 THEN  如果变量为0 就提交事务 否则进行回滚
          COMMIT;
       ELSE
          ROLLBACK;
       END IF;

    跳出while 循环

    dev_while: while done=0 DO --  dev_while: 加wehile 这样是为了 跳出while

      IF t_error = 1 THEN  --  出现异常
             leave dev_while;     -- 跳出当前while 循环

    if 进行空判断时 不能写 if 'a'!=null 或 if 'a'=null 必须 if 'a' is not null 或 if 'a' is null

      'a' = null 得到的是空值

    如果mysql 相对存储过程进行断点调试 可以使用dbforge studio for mysql 进行断点调试

    注意点:

    select ** into **  如果没有查询到值,那么游标会跳出循环 必须加判断

     IF(EXISTS(select 1 from offline o where o.offline_id  = ( SELECT max(offline_id) offline_id from offline ol where ol.device_id = dev_id))) THEN

    列子如下:

    create PROCEDURE count_offline()
    
    BEGIN
       DECLARE dev_id int;   -- DECLARE  用来定义变量 declare +变量名+数据类型,有的数据类型必须指定长度
       DECLARE is_online int; 
       DECLARE done BOOLEAN DEFAULT 0;  -- 定义一个变量,只有当游标到底时,才会改变
       DECLARE begintime VARCHAR(30); 
       DECLARE endtime VARCHAR(30); 
       DECLARE data_count BIGINT; -
       DECLARE offline_end int ;
       DECLARE last_offline_report_time BIGINT; 
       DECLARE newset_report_time datetime;
       DECLARE last_offline_id BIGINT;
       DECLARE t_error INTEGER DEFAULT 0; -- 定义一个变量 ,只有当执行出错时, 才会改变变量值
       DECLARE dev_rs CURSOR FOR select device_id from device;
       -- 将结束标志绑定到游标
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
       -- 把错误标志 绑定到 异常中
       DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
       set  begintime = (select date_format (now(),'%Y-%m-%d %H:00:00'));
       set  endtime =  (select date_format (now(),'%Y-%m-%d %H:59:59'));
       open dev_rs;
       FETCH   dev_rs into  dev_id;
       START TRANSACTION;  -- 开启事务
       dev_while: while done=0 DO --  dev_while: 加wehile 这样是为了 跳出while
         set is_online = (SELECT d.is_online  from device d where d.device_id = dev_id);
         
          IF(EXISTS(select 1 from offline o where o.offline_id  = ( SELECT max(offline_id) offline_id from offline ol where ol.device_id = dev_id))) THEN
              select o.offline_end ,o.last_report_time ,o.offline_id into offline_end,   last_offline_report_time,last_offline_id from  offline o where o.offline_id  = ( SELECT max(offline_id) offline_id from offline ol where ol.device_id = dev_id);
          ELSE
           
            set offline_end = 1;
            set last_offline_report_time = NULL;
          END IF; 
        
         set data_count = (select count(*)   from device_datas_hour ddh where ddh.device_id = dev_id and ddh.create_time BETWEEN begintime and endtime) ;  
        
         if(data_count > 0) THEN          
               IF(is_online = 0) THEN
                   update device d set d.is_online =1 where d.device_id = dev_id;
               END IF;       
               IF( offline_end =0) THEN            
                 set newset_report_time = (select MIN(ddh.create_time)  from device_datas_hour ddh where ddh.device_id = dev_id and ddh.create_time BETWEEN begintime and endtime);
                 update offline ol set   ol.offline_end = 1 ,  ol.offine_end_time=newset_report_time  ,  ol.offline_time =  (UNIX_TIMESTAMP(newset_report_time) - last_offline_report_time)  where ol.offline_id = last_offline_id;
               END IF;
      
         ELSE
           
             set newset_report_time = (select MAX(ddh.create_time)  from device_datas_hour ddh where ddh.device_id = dev_id );
             IF(is_online = 1) THEN
                   update device d set d.is_online = 0 where d.device_id = dev_id; 
             END IF;
             IF(newset_report_time IS NOT NULL) THEN
             
                IF(offline_end = 1)  THEN
                    INSERT into offline (device_id,create_time,offline_time,offline_end,last_report_time) VALUES(dev_id,now(),(UNIX_TIMESTAMP(NOW()))-(UNIX_TIMESTAMP(newset_report_time)),0,(UNIX_TIMESTAMP(newset_report_time)));
          
                 ELSEIF(offline_end = 0) THEN
                     update offline ol set   ol.offline_time =  (UNIX_TIMESTAMP(NOW()))-last_offline_report_time where ol.offline_id = last_offline_id;   
                 END IF;
             END IF;   
         END IF;
         IF t_error = 1 THEN  --  出现异常
             leave dev_while;     -- 跳出当前while 循环
         END IF;
         FETCH dev_rs INTO dev_id;    
       END WHILE;   -- 结束while
       CLOSE dev_rs; -- 关闭游标
       -- 提交事务
       IF t_error = 0 THEN 
          COMMIT;
       ELSE
          ROLLBACK;
       END IF;
      
     END


    展开全文
  • 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的-种数据库对象。 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要...
  • 本文通过一个实例来给大家讲述一下Mysql数据库存储过程基本语法,希望你能喜欢。
  • MSSQL中动态执行sql语句可以使用EXEC()函数。MSSQL中也有类似的函数EXECUTE(),不过不同的是MYSQL中动态执行存储过程语句与MSSQL还是有区别的。
  • 主要介绍了mysql存储过程之错误处理,结合实例形式详细分析了mysql存储过程错误处理相关原理、操作技巧与注意事项,需要的朋友可以参考下
  • 一、变量的定义 mysql中变量定义用declare来定义...二、mysql存储过程变量赋值 变量的赋值可直接赋值与查询赋值来操作,直接赋值可以用set来操作,可以是常量或表达式如果下 代码如下: set var_name= [,var_name expr]
  • 主要介绍了MySQL存储过程及常用函数代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • mysql存储过程语法

    千次阅读 2009-10-20 17:40:00
    变量定义:DECLARE variable_name [,variable_name...] datatype [DEFAULT value];其中,datatype为mysql的数据类型,如:INT, FLOAT, DATE, VARCHAR(length)例:DECLARE l_int INT unsigned default 4000000
  • mysql 、oracle存储过程语法区别

    千次阅读 2015-05-28 08:12:01
    项目需要把oracle存储过程转成mysql,一些语法不同,做些记录,供下次参考。
  • 定义存储过程的方法有很多,不同的数据库语法也各不相同,这里不再赘述。我要说的是一种语法错误的解决方法。假设现在有一个课程数据库,数据库课程表内容如下:现在我想编写一个存储过程,输入是课程编号,输出是...
  • MySQL 5.6存储过程和函数语法的简单介绍

    千次阅读 热门讨论 2020-10-19 12:43:38
    MySQL支持存储的例程(存储过程存储函数) 存储的例程是一组可以存储在服务器中的SQL语句。完成此操作后,客户无需继续重新发出各个语句,而是可以引用存储的例程。 首先先进行存储的例程语法学习: 使用create ...
  • MySQL存储过程使用游标循环数据列表

    千次阅读 2019-02-26 10:04:43
    本篇文章主要讲解,我的一个案例,使用存储...MySQL使用存储过程循环数据列表? 2、先描述下MySQL有哪些循环的语法 while循环 CREATE PROCEDURE proc_while () BEGIN DECLARE num INT ; SET num = 0 ; ...
  • 本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下: 除了if语句,mysql提供了一个替代的条件语句CASE。 mysql的 CASE语句使代码更加可读和高效。废话不多说,我们先来看下简单case语句的...
  • 本文实例讲述了mysql存储过程之循环语句(WHILE,REPEAT和LOOP)用法。分享给大家供大家参考,具体如下: MySQL提供循环语句,允许我们根据条件重复执行一个SQL代码块其中有三个循环语句:WHILE,REPEAT和LOOP,我们...
  • MYSQL存储过程的创建,调用及语法

    千次阅读 2019-01-18 23:44:30
    MYSQL存储过程的创建,调用及语法 转载自这篇文章 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储...
  • MySQL存储过程定义及常见函数详解

    千次阅读 2018-07-04 11:05:06
    存储过程简介SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行...
  • MySQL存储过程练习.pdf

    2020-07-02 16:14:39
    掌握存储过程语法格式使用方法 3. 掌握存储过程的创建执行 二 实验内容 注意做一下实验需要首先建立数据及其相应的表并输入一些记录 1. 实验 1 创建一个存储过程实现查询表 student 中的记录信息并执行存储过 程 ...
  • 文章目录一、存储过程1.1、语法:1.2、示例1.2.1、无参数的存储过程1.2.3、只有一个 in 参数的存储过程1.2.3、包含 in 参数和 out 参数的存储过程1.2.4、包含 inout 参数的存储过程1.2.5、附:根据 时间 修改 状态:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,314
精华内容 67,725
关键字:

mysql存储过程语法

mysql 订阅