mysql分隔符错误

时间:2009-08-12 16:13:14

标签: mysql

修饰的。

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:DROP FUNCTION IF   EXISTS PersonName; #MySQL返回   空结果集(即零行)。

     

DELIMITER |; DELIMITER |; DELIMITER |;   DELIMITER |; DELIMITER |; DELIMITER |;   DELIMITER |;

     

SQL查询:

     

DELIMITER |;

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

9 个答案:

答案 0 :(得分:12)

我会在END之后删除分号。

    ...
END
|
DELIMITER ;

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

DELIMITER |;

现在MySQL认为分隔符是“|;” (两个字符,一个管道和一个分号)。如果您考虑一下,MySQL客户端必须以特殊方式处理DELIMITER 。这是当前分隔符不能后面的唯一声明。

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

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 ;

答案 1 :(得分:5)

试试这个:

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 */

答案 2 :(得分:3)

如果您使用的是phpMyAdmin,请尝试此操作:

http://dotnetfish.blogspot.com/2009/07/1064-you-have-error-in-your-sql-syntax.html

答案 3 :(得分:2)

在您将分隔符恢复为分号的最后一行中,您需要DELIMITER;之间的空格,即

DELIMITER ;

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

我遇到了分隔符问题。我正在使用Navicat,然后我转到MySql工作台,问题解决了。 Workbench将分隔符插入代码...

答案 6 :(得分:0)

你必须在mysql脚本的开头和最后添加delimiter $$,你应该以{{1​​}}

结束

答案 7 :(得分:0)

我打算把它放在混合中,因为它可以帮助解决这个问题的其他人。

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

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

CREATE FUNCTION
blah blah...
END 
$$

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

答案 8 :(得分:0)

我最近偶然发现了使用 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 Script 中添加以下变更集,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 脚本中的变更集将被执行而不会出现任何错误。 通过使用服务类调用存储库方法,将填充存储过程所需的结果。

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