博客
关于我
MySql中 delimiter 详解
阅读量:792 次
发布时间: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 常见ALTER TABLE操作
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>
    MySQL 数据库备份种类以及常用备份工具汇总
    查看>>
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    查看>>
    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
    查看>>
    MySQL 数据库的高可用性分析
    查看>>
    Mysql 数据库重置ID排序
    查看>>
    Mysql 数据类型一日期
    查看>>
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>