试图在 Mysql 中创建存储过程的语法错误?

Posted

技术标签:

【中文标题】试图在 Mysql 中创建存储过程的语法错误?【英文标题】:Syntax error trying to create an Stored Procedure in Mysql? 【发布时间】:2017-01-06 04:47:03 【问题描述】:

我正在尝试在 mysql 中创建一个存储过程,但是当我尝试时,phpmyadmin 告诉我有一个语法错误。为什么?我正在寻找这个问题可能是因为我的 if else 条件中有 CASE 语句,但据我所知,这太疯狂了,我希望你能帮助我并告诉我 Mysql 中的这个存储过程有什么问题.谢谢。

DELIMITER $$

CREATE PROCEDURE extraer_fechas(
    statusFecha SMALLINT(5),
    string_busqueda VARCHAR(50)
)
BEGIN

IF string_busqueda = "false" THEN
    SELECT
        CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha_php,
        fechas.ID, 
        fechas.dates, 
        fechas.month, 
        fechas.year, 
        paises.nombre AS city,
        fechas.region, 
        fechas.place, 
        fechas.tickets, 
        fechas.directions, 
        fechas.flyer,
        seo_sitemap.title,
        seo_sitemap.description,
        seo_sitemap.url,
        seo_sitemap.array_tags
            FROM fechas 
                INNER JOIN paises ON fechas.city = paises.id_pais 
                INNER JOIN seo_sitemap ON seo_sitemap.id_articulo = fechas.ID
            WHERE seo_sitemap.id_tabla = 1
            AND fechas.status_fecha = statusFecha
        ORDER BY 
        fechas.month,
        fechas.dates,
        fechas.year 

ELSE
    SELECT 
        CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha_php,
        fechas.ID, 
        fechas.dates, 
        fechas.month, 
        fechas.year, 
        paises.nombre AS city,
        fechas.region, 
        fechas.place, 
        fechas.tickets, 
        fechas.directions, 
        fechas.flyer,
        seo_sitemap.title,
        seo_sitemap.description,
        seo_sitemap.url,
        seo_sitemap.array_tags              
            FROM fechas 
                INNER JOIN paises ON fechas.city = paises.id_pais
                INNER JOIN seo_sitemap ON seo_sitemap.id_articulo = fechas.ID
        WHERE 
            CONCAT(fechas.place,' ',fechas.region,', ',paises.nombre,', ',( 
            CASE fechas.month
                WHEN 01 THEN 'Enero'
                WHEN 02 THEN 'Febrero'
                WHEN 03 THEN 'Marzo'
                WHEN 04 THEN 'Abril'
                WHEN 05 THEN 'Mayo'
                WHEN 06 THEN 'Junio'
                WHEN 07 THEN 'Julio'
                WHEN 08 THEN 'Agosto'
                WHEN 09 THEN 'Septiembre'
                WHEN 10 THEN 'Octubre'
                WHEN 11 THEN 'Noviembre'
                WHEN 12 THEN 'Diciembre'
            END),' ',fechas.dates,' de ',fechas.year) 
        LIKE '%string_busqueda%'
        AND seo_sitemap.id_tabla = 1
        AND fechas.status_fecha = statusFecha  ;
END IF;

END$$

MYSQL 错误是:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ELSE SELECT CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha' at line 34

再次感谢。

【问题讨论】:

请贴出错误代码和信息。 对不起。这是#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ELSE SELECT CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha' at line 34谢谢 【参考方案1】:

我认为你不能使用分隔符

为什么需要分隔符??

我尝试了这段代码并且工作正常

CREATE PROCEDURE extraer_fechas(
    statusFecha SMALLINT(5),
    string_busqueda VARCHAR(50)
)
BEGIN

IF string_busqueda = "false" THEN
    SELECT
        CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha_php,
        fechas.ID, 
        fechas.dates, 
        fechas.month, 
        fechas.year, 
        paises.nombre AS city,
        fechas.region, 
        fechas.place, 
        fechas.tickets, 
        fechas.directions, 
        fechas.flyer,
        seo_sitemap.title,
        seo_sitemap.description,
        seo_sitemap.url,
        seo_sitemap.array_tags
            FROM fechas 
                INNER JOIN paises ON fechas.city = paises.id_pais 
                INNER JOIN seo_sitemap ON seo_sitemap.id_articulo = fechas.ID
            WHERE seo_sitemap.id_tabla = 1
            AND fechas.status_fecha = statusFecha
        ORDER BY 
        fechas.month,
        fechas.dates,
        fechas.year 

;ELSE
    SELECT 
        CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha_php,
        fechas.ID, 
        fechas.dates, 
        fechas.month, 
        fechas.year, 
        paises.nombre AS city,
        fechas.region, 
        fechas.place, 
        fechas.tickets, 
        fechas.directions, 
        fechas.flyer,
        seo_sitemap.title,
        seo_sitemap.description,
        seo_sitemap.url,
        seo_sitemap.array_tags              
            FROM fechas 
                INNER JOIN paises ON fechas.city = paises.id_pais
                INNER JOIN seo_sitemap ON seo_sitemap.id_articulo = fechas.ID
        WHERE 
            CONCAT(fechas.place,' ',fechas.region,', ',paises.nombre,', ',( 
            CASE fechas.month
                WHEN 01 THEN 'Enero'
                WHEN 02 THEN 'Febrero'
                WHEN 03 THEN 'Marzo'
                WHEN 04 THEN 'Abril'
                WHEN 05 THEN 'Mayo'
                WHEN 06 THEN 'Junio'
                WHEN 07 THEN 'Julio'
                WHEN 08 THEN 'Agosto'
                WHEN 09 THEN 'Septiembre'
                WHEN 10 THEN 'Octubre'
                WHEN 11 THEN 'Noviembre'
                WHEN 12 THEN 'Diciembre'
            END),' ',fechas.dates,' de ',fechas.year) 
        LIKE '%string_busqueda%'
        AND seo_sitemap.id_tabla = 1
        AND fechas.status_fecha = statusFecha
;END IF

;end

【讨论】:

您好,谢谢,但还没有工作。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ELSE SELECT CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha' at line 34【参考方案2】:

试试下面它对我有用

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `extraer_fechas`(
    statusFecha SMALLINT(5),
    string_busqueda VARCHAR(50)
)
BEGIN

IF string_busqueda = "false" THEN
    SELECT
        CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha_php,
        fechas.ID, 
        fechas.dates, 
        fechas.month, 
        fechas.year, 
        paises.nombre AS city,
        fechas.region, 
        fechas.place, 
        fechas.tickets, 
        fechas.directions, 
        fechas.flyer,
        seo_sitemap.title,
        seo_sitemap.description,
        seo_sitemap.url,
        seo_sitemap.array_tags
            FROM fechas 
                INNER JOIN paises ON fechas.city = paises.id_pais 
                INNER JOIN seo_sitemap ON seo_sitemap.id_articulo = fechas.ID
            WHERE seo_sitemap.id_tabla = 1
            AND fechas.status_fecha = statusFecha
        ORDER BY 
        fechas.month,
        fechas.dates,
        fechas.year;
ELSE
    SELECT 
        CONCAT(fechas.year,'-',fechas.month,'-',fechas.dates) AS fecha_php,
        fechas.ID, 
        fechas.dates, 
        fechas.month, 
        fechas.year, 
        paises.nombre AS city,
        fechas.region, 
        fechas.place, 
        fechas.tickets, 
        fechas.directions, 
        fechas.flyer,
        seo_sitemap.title,
        seo_sitemap.description,
        seo_sitemap.url,
        seo_sitemap.array_tags              
            FROM fechas 
                INNER JOIN paises ON fechas.city = paises.id_pais
                INNER JOIN seo_sitemap ON seo_sitemap.id_articulo = fechas.ID
        WHERE 
            CONCAT(fechas.place,' ',fechas.region,', ',paises.nombre,', ',( 
            CASE fechas.month
                WHEN 01 THEN 'Enero'
                WHEN 02 THEN 'Febrero'
                WHEN 03 THEN 'Marzo'
                WHEN 04 THEN 'Abril'
                WHEN 05 THEN 'Mayo'
                WHEN 06 THEN 'Junio'
                WHEN 07 THEN 'Julio'
                WHEN 08 THEN 'Agosto'
                WHEN 09 THEN 'Septiembre'
                WHEN 10 THEN 'Octubre'
                WHEN 11 THEN 'Noviembre'
                WHEN 12 THEN 'Diciembre'
            END),' ',fechas.dates,' de ',fechas.year) 
        LIKE '%string_busqueda%'
        AND seo_sitemap.id_tabla = 1
        AND fechas.status_fecha = statusFecha  ;
END IF;
END

【讨论】:

以上是关于试图在 Mysql 中创建存储过程的语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL/MariaDB 中创建存储过程时出错

如何在mysql数据库中创建一个包含请求的存储过程

mySql 中创建过程的语法错误

mysql - 在存储过程中创建事件

在 SQL Server Management Studio 中创建存储过程时出现语法错误

无法在 phpmyadmin 中创建程序