“分隔符”在此位置无效,需要 CREATE

Posted

技术标签:

【中文标题】“分隔符”在此位置无效,需要 CREATE【英文标题】:"Delimiter" is not valid at this position, expecting CREATE 【发布时间】:2020-08-17 05:09:57 【问题描述】:

我收到一个错误“分隔符”在这个位置无效,期待创建“因为我正在编写一个存储过程并且无法找出原因。我认为这可能是 mysql 工作台的问题,因为下面的代码给出了同样的错误,但是是直接从this website复制而来的。

DELIMITER $$
CREATE PROCEDURE GetTotalOrder()
BEGIN
    DECLARE totalOrder INT DEFAULT 0;
    
    SELECT COUNT(*) 
    INTO totalOrder
    FROM orders;
    
    SELECT totalOrder;
END$$
DELIMITER ;

编辑:我真正的存储过程是:

DELIMITER //
CREATE PROCEDURE GetSimilar(inputdate char(10))
BEGIN
    Declare id(tinyint) DEFAULT 0;
    Set id := (select t.IdTimelineinfo
        From timelineinfo t
        WHERE t.Date = inputdate);
    SELECT t.Date From timelineinfo t where t.date = inputdate;
    SELECT o.Name, o.Race, o.Sex, o.IdOfficer
        FROM timelineinfo
        JOIN timelineinfo_officer ON timelineinfo.IdTimelineinfo = timelineinfo_officer.IdTimelineinfo      
        JOIN officers o ON timelineinfo_officer.IdOfficer = o.IdOfficer
        WHERE timelineinfo.IdTimelineinfo = id
        UNION
    SELECT s.IdSubject, s.Name, s.Race, s.Sex
        FROM timelineinfo
        JOIN timelineinfo_subject ON timelineinfo.IdTimelineinfo = timelineinfo_subject.IdTimelineinfo      
        JOIN subjects s ON timelineinfo_subject.IdSubject = s.IdSubject
        WHERE timelineinfo.IdTimelineinfo = id;
        UNION
    Select * 
        From media m
        Where (m.IdTimelineinfo = id);
END //
DELIMITER ;

【问题讨论】:

在您的特定情况下,您可以将您的过程转换为单语句形式 CREATE PROCEDURE GetTotalOrder() SELECT COUNT(*) totalOrder FROM orders; 并完全避免使用 DELIMITER。 这可能适用于该问题,但不能解决实际问题,我编辑了我的问题以表明这不适用于我的实际存储过程,因为我有多个语句跨度> 我认为研究您使用的客户端工具的文档是合乎逻辑的,它必须包含有关程序创建的信息 - 例如,您可能必须使用一些特殊的窗口类型或一些明确的分隔符或设置一些选项,如“作为原始 SQL 发送”......或者您可能会使用本网站或 DBA.STACKEXCHANGE.COM 的搜索找到此类信息...... 【参考方案1】:

注意编辑过程 SQL 代码的位置。有一个专用的例程对象编辑器(就像表、触发器、视图等一样),它只接受与其关联对象类型的 SQL 代码。因此,它们不需要分隔符,如果您使用分隔符,甚至会发出错误信号。

另一方面,您始终可以在 SQL IDE 代码编辑器中直接编辑 SQL 代码,而无需执行此类特殊处理。在这种情况下,您需要分隔符。

【讨论】:

我不太清楚你的意思。我试图使用 MySQL Workbench 添加一个新的存储过程并单击“创建存储过程” 此命令打开一个专用的存储例程对象编辑器。当您右键单击模式树中的存储例程(过程/函数)并从上下文菜单中选择编辑...时,您会看到相同的结果。 啊,谢谢你的解释,我对这种事情还比较陌生

以上是关于“分隔符”在此位置无效,需要 CREATE的主要内容,如果未能解决你的问题,请参考以下文章

使用 create-hive-table 在 Hive 中创建表时如何使用自定义分隔符

使用oracle按分隔符位置拆分字符串

语法错误:“)”在此位置无效,需要 EOF ,';'

MySQL 错误:HAVING 在此位置无效,需要 EOF,';'

在 Perl 中获取分隔符 RegExp 的第一个分隔符位置的正确方法是啥

带有逗号分隔符的数字的正则表达式验证