博客
关于我
MySql中 delimiter 详解
阅读量:791 次
发布时间:2023-02-11

本文共 2283 字,大约阅读时间需要 7 分钟。

MySQL存储过程的执行问题及解决方案

在实际开发中,尤其是在使用MySQL存储过程时,可能会遇到一些客户端工具与存储过程执行方式不兼容的问题。本文将详细讲解一个典型案例,并提供解决方案。


问题背景

我们编写了一个统计网站访问情况(User Agent)的MySQL存储过程。该存储过程的代码如下:

delimiter //;drop procedure if exists pr_stat_agent;create procedure pr_stat_agent(    pi_date_from date,    pi_date_to date) begin    -- 检查输入    if (pi_date_from is null) then        set pi_date_from = current_date();    end if;        if (pi_date_to is null) then        set pi_date_to = pi_date_from;    end if;        set pi_date_to = date_add(pi_date_from, interval 1 day);        -- 统计访问情况    select agent, count(*) as cnt    from apache_log    where request_time >= pi_date_from      and request_time < pi_date_to    group by agent    order by cnt desc;end //

在EMS SQL Manager 2005 for MySQL中,这段代码可以正常运行。但在使用SQLyog MySQL GUI v5.02时,存储过程会报错。经过深入分析,发现问题的根本原因是与MySQL客户端工具的delimiter设置不兼容。


delimiter设置的关键作用

默认情况下,MySQL客户端工具的delimiter设置为;,表示每行输入后都会被视为一条独立的SQL语句并执行。这在大多数情况下是正常的操作方式,但在编写复杂存储过程时会带来问题。

例如,在上面的存储过程中,每个SQL语句的结尾都有;。如果客户端工具默认使用;作为Delimiter,那么每个;都会被误解为一个新的SQL语句的结束符,从而导致存储过程的执行失败。


解决方案:合理设置Delimiter

为了避免这种问题,我们可以通过设置合适的Delimiter来确保存储过程能够正确执行。以下是具体的解决方案步骤:

  • 临时改变Delimiter

    在运行存储过程之前,先将Delimiter临时设置为//。这样可以确保MySQL解释器不会将;误解为语句结束符。

    mysql> delimiter //
  • 创建并执行存储过程

    在新的Delimiter设置下,逐步执行存储过程。例如:

    mysql> drop procedure if exists pr_stat_agent;mysql> create procedure pr_stat_agent(    pi_date_from date,    pi_date_to date) begin    -- 检查输入    if (pi_date_from is null) then        set pi_date_from = current_date();    end if;    if (pi_date_to is null) then        set pi_date_to = pi_date_from;    end if;    set pi_date_to = date_add(pi_date_from, interval 1 day);    -- 统计访问情况    select agent, count(*) as cnt    from apache_log    where request_time >= pi_date_from      and request_time < pi_date_to    group by agent    order by cnt desc;end //
  • 恢复默认Delimiter

    存储过程执行完成后,需要将Delimiter恢复为默认值;,以避免对后续SQL语句造成影响。

    mysql> delimiter ;

  • 注意事项

  • delimiter的灵活性

    MySQL的delimiter设置非常灵活,可以根据具体需求设置为/||等其他符号。然而,在存储过程编写中,//;是最常用的选择。

  • 客户端工具的限制

    不同的MySQL客户端工具对Delimiter的处理方式可能有所不同。例如,SQLyog可能需要额外配置才能支持自定义Delimiter。

  • 文件执行方式

    如果存储过程代码存储在文件中(如d:\pr_stat_agent.sql),可以通过source命令或\.命令执行。例如:

    mysql> source d:\pr_stat_agent.sqlmysql> . d:\pr_stat_agent.sql

  • 总结

    通过合理设置Delimiter,可以有效避免MySQL存储过程在特定客户端工具下执行失败的问题。记住,Delimiter的设置对存储过程的执行方式有直接影响,正确配置可以显著提升开发和维护效率。

    转载地址:http://psbfk.baihongyu.com/

    你可能感兴趣的文章
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    MySQL 错误
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-connector-java各种版本下载地址
    查看>>
    mysql-group_concat
    查看>>
    MySQL-redo日志
    查看>>
    MySQL-【1】配置
    查看>>
    MySQL-【4】基本操作
    查看>>
    Mysql-丢失更新
    查看>>
    Mysql-事务阻塞
    查看>>
    Mysql-存储引擎
    查看>>
    mysql-开启慢查询&所有操作记录日志
    查看>>
    MySQL-数据目录
    查看>>
    MySQL-数据页的结构
    查看>>
    MySQL-架构篇
    查看>>