修饰的。的
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行
答案 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 脚本集成。
将您的 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 Script 中添加以下变更集,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 脚本中的变更集将被执行而不会出现任何错误。 通过使用服务类调用存储库方法,将填充存储过程所需的结果。
希望这会对某人有所帮助。