已修改。
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 行
我会删除
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 ;
试试这个:
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 */
如果您使用 phpMyAdmin,请尝试此操作:
http://dotnetfish.blogspot.com/2009/07/1064-you-have-error-in-your-sql-syntax.html
我的分隔符有问题。我使用的是Navicat,然后我转到MySql工作台,问题就解决了。 Workbench 将分隔符插入代码中...
最好的解决方案是,我在收到上述错误后尝试过。代码应该是这样的
Delimiter //
Create function or procedure
Write your function or procedure here...
End (without semicolon)
//
Delimiter ; (semicolon with space)
在将分隔符恢复为分号的最后一行中,您需要在
DELIMITER
和 ;
之间留一个空格,即
DELIMITER ;
我最近偶然发现使用 Spring Boot 项目将 MySQL 存储过程与 Liquibase 脚本集成。
将您的 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
#
在 Liquibase 脚本中添加以下更改集,DELIMITER 为 #
<changeSet id="1" author="ishaq" runOnChange="true">
<sqlFile path="procedures/GetCustomersWithCreditCardExpiry.sql"
relativeToChangelogFile="true"
endDelimiter="#"
splitStatements="true"/>
</changeSet>
在 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);
映射结果的实体类
@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 脚本中的变更集将被执行,不会出现任何错误。 通过使用服务类调用存储库方法,将填充存储过程所需的结果。
希望这会对某人有所帮助。
您必须在 mysql 脚本的开头和最后添加
delimiter $$
,并以 delimiter
结尾
我将把它加入其中,因为它可能会帮助其他人解决这个问题。
如果您使用 phpMyAdmin,在 SQL 输入框下方有一个分隔符框,您可以在其中键入用于查询的分隔符。如果需要,您可以将外部分隔符放在这里,然后就不需要分隔符指令了。
例如,如果您将分隔符 $$ 放入框中,则可以使用以下格式进行查询。
CREATE FUNCTION
blah blah...
END
$$
有些人可能会觉得这更容易。
运行这个 Dbeaver 给出了这个错误...在 mysql shell 中运行它,你不会得到任何错误..
当我创建事件时,我遇到了同样的错误,如下所示:
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 ;