在 MySQL 中使用自定义分隔符出错?

问题描述 投票:0回答:11

已修改。

DROP FUNCTION IF EXISTS PersonName;
DELIMITER |;

CREATE FUNCTION PersonName( personID SMALLINT )
RETURNS CHAR(20)
BEGIN
  DECLARE pname CHAR(20) DEFAULT '';
  SELECT name INTO pname FROM family WHERE ID=personID;
  RETURN pname;
END;
|
DELIMITER ;

这段代码有什么问题吗?我收到以下错误。

您的 SQL 查询似乎有错误。 MySQL服务器错误 下面的输出,如果有的话,可能 还可以帮助您诊断 问题

错误:未知的标点符号字符串@ 102 STR:|; SQL:删除函数 IF EXISTS PersonName;# MySQL 返回一个 空结果集(即零行)。

分隔符 |;分隔符 |;分隔符 |; 分隔符 |;分隔符 |;分隔符 |; 分隔符 |;

SQL查询:

分隔符 |;

MySQL 说:文档 #1064 - 你的 SQL 语法有错误;检查手册 对应你的MySQL服务器 正确使用语法的版本 靠近“DELIMITER |”在第 1 行

sql mysql database delimiter mysql-error-1064
11个回答
18
投票

我会删除

END
后面的分号。

    ...
END
|
DELIMITER ;

回复您的评论,声明新分隔符时不能使用当前分隔符。这听起来令人困惑,但请考虑一下是否这样做:

DELIMITER |;

现在MySQL会认为分隔符是“|;” (两个字符,一个竖线和一个分号)。如果你想一想,

DELIMITER
必须被MySQL客户端以特殊的方式对待。这是唯一一个 can't 后跟当前分隔符的声明。

因此,在将分隔符设置为管道时,请执行以下操作:

DELIMITER |

将其设置回分号时,请执行以下操作:

DELIMITER ;

FWIW,我在 MySQL 5.0.75 上的本地测试数据库上运行了以下命令,没有出现错误:

DROP FUNCTION IF EXISTS PersonName;
DELIMITER |

CREATE FUNCTION PersonName( personID SMALLINT )
RETURNS CHAR(20)
BEGIN
  DECLARE pname CHAR(20) DEFAULT '';
  SELECT name INTO pname FROM family WHERE ID=personID;
  RETURN pname;
END
|
DELIMITER ;

8
投票

试试这个:

DROP FUNCTION IF EXISTS PersonName;
DELIMITER |

CREATE FUNCTION PersonName( personID SMALLINT )
RETURNS CHAR(20)
BEGIN
  DECLARE pname CHAR(20) DEFAULT '';
  SELECT name INTO pname FROM family WHERE ID=personID;
  RETURN pname;
END;
|
DELIMITER ; /* <-- add a space between DELIMITER and the semicolon */

3
投票

3
投票

我的分隔符有问题。我使用的是Navicat,然后我转到MySql工作台,问题就解决了。 Workbench 将分隔符插入代码中...


3
投票

最好的解决方案是,我在收到上述错误后尝试过。代码应该是这样的

Delimiter //
Create function or procedure
Write your function or procedure here...
End (without semicolon)
//
Delimiter ; (semicolon with space)

2
投票

在将分隔符恢复为分号的最后一行中,您需要在

DELIMITER
;
之间留一个空格,即

DELIMITER ;

2
投票

我最近偶然发现使用 Spring Boot 项目将 MySQL 存储过程与 Liquibase 脚本集成。

  1. 将您的 MySQL 存储过程粘贴到保存在 liquibase 目录下的 GetCustomersWithCreditCardExpiry.sql 文件中。

    DROP PROCEDURE IF EXISTS GetCustomersWithCreditCardExpiry;
    #
    CREATE PROCEDURE GetCustomersWithCreditCardExpiry(IN customer_status VARCHAR(10), IN time_period INT(11))
    BEGIN
    SELECT cs.*
    FROM customer cs
      JOIN credit_card cc
           ON cc.id = cs.credit_card_id
    WHERE cs.status = customer_status
    AND cc.expiry_date < DATE_ADD(now(), INTERVAL time_period HOUR);
    END
    #
    
  2. 在 Liquibase 脚本中添加以下更改集,DELIMITER 为 #

    <changeSet id="1" author="ishaq" runOnChange="true">

    <sqlFile path="procedures/GetCustomersWithCreditCardExpiry.sql"

    relativeToChangelogFile="true"

    endDelimiter="#"

    splitStatements="true"/>

    </changeSet>

  3. 在 Spring Boot Java 应用程序中使用存储过程。

     @Query(value = "CALL GetCustomersWithCreditCardExpiry(:customer_status, :time_period);", nativeQuery = true)
     List<CustomerCreditCardRenewal> GetCustomersWithCreditCardExpiry(@Param("customer_status") String customer_status,
                                                                    @Param("time_period") Integer time_period);
    
  4. 映射结果的实体类

    @Builder(toBuilder = true)
    @AllArgsConstructor
    @NoArgsConstructor
    @Getter
    @Data
    @Entity
    @NamedStoredProcedureQuery(name = "CustomerCreditCardRenewal.getCustomersWithCreditCardExpiry",
     procedureName = "GetCustomersWithCreditCardExpiry",
     parameters = {
             @StoredProcedureParameter(
                     mode = ParameterMode.IN,
                     name = "customer_status",
                     type = String.class
             ),
             @StoredProcedureParameter(
                     mode = ParameterMode.IN,
                     name = "time_period",
                     type = Integer.class
             )
     })
     public class CustomerCreditCardRenewal {
     //... members
     }
    

当 Spring Boot 应用程序运行时,Liquibase 脚本中的变更集将被执行,不会出现任何错误。 通过使用服务类调用存储库方法,将填充存储过程所需的结果。

希望这会对某人有所帮助。


0
投票

您必须在 mysql 脚本的开头和最后添加

delimiter $$
,并以
delimiter

结尾

0
投票

我将把它加入其中,因为它可能会帮助其他人解决这个问题。

如果您使用 phpMyAdmin,在 SQL 输入框下方有一个分隔符框,您可以在其中键入用于查询的分隔符。如果需要,您可以将外部分隔符放在这里,然后就不需要分隔符指令了。

例如,如果您将分隔符 $$ 放入框中,则可以使用以下格式进行查询。

CREATE FUNCTION
blah blah...
END 
$$

有些人可能会觉得这更容易。


0
投票

运行这个 Dbeaver 给出了这个错误...在 mysql shell 中运行它,你不会得到任何错误..


0
投票

当我创建事件时,我遇到了同样的错误,如下所示:

mysql> USE apple;
mysql> CREATE EVENT my_event
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2023-11-08 00:00:00'
    -> DO
    -> BEGIN
    -> SELECT * FROM person;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6

因此,我在创建事件时将默认分隔符

;
更改为
$$
之类的内容,然后错误就解决了。然后,在创建事件后,我将分隔符
$$
更改回
;
,如下所示:

mysql> USE apple;
mysql> delimiter $$
    -> CREATE EVENT my_event
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2023-11-08 00:00:00'
    -> DO
    -> BEGIN
    -> SELECT * FROM person;
    -> END$$
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

而且,我收到以下错误:

DELIMITER 后面必须跟一个“分隔符”字符或字符串

当我使用默认分隔符“;”运行分隔符命令时不要在

delimiter
;
之间放置任何空格,如下所示:

delimiter;

所以,我在

delimiter
;
之间加了一个空格,如下所示,然后错误就解决了:

      -- ↓ A space
delimiter ;
© www.soinside.com 2019 - 2024. All rights reserved.