Stored procedures 错误1064:您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解要使用的正确语法

Stored procedures 错误1064:您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解要使用的正确语法,stored-procedures,mariadb,Stored Procedures,Mariadb,我有一个名为procedure.Sql的Sql文件,其中包含一个过程。 Maria DB版本:服务器版本:10.0.29-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04 但我得到的错误如下: >mysql -u root -p XXX < /home/azure/Downloads/procedure.sql >Enter password: >ERROR 1064 (42000) at line 2: You have an error

我有一个名为procedure.Sql的Sql文件,其中包含一个过程。 Maria DB版本:服务器版本:10.0.29-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

但我得到的错误如下:

>mysql -u root -p XXX < /home/azure/Downloads/procedure.sql 
>Enter password: 
>ERROR 1064 (42000) at line 2: 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 '();
>USE XXX;
>CREATE OR REPLACE PROCEDURE XXX.updateDoc_StorageID () 
>BEGIN' at line 1
我得到的参考资料来自:
语法错误不是针对
创建过程的,而是针对前面的
删除过程的,您不应该在那里使用括号

DROP PROCEDURE IF EXISTS XXX.updateDoc_StorageID;
第二个错误随之而来,因为过程没有被删除,所以它仍然存在


另外,修复分隔符——如果您在开始时设置了
$$
,那么每个进一步的查询都应该以
$$
结束,而不是分号。

语法错误不适用于
创建过程
,它适用于前面的
删除过程
,您不应该在那里有括号

DROP PROCEDURE IF EXISTS XXX.updateDoc_StorageID;
第二个错误随之而来,因为过程没有被删除,所以它仍然存在


另外,修复分隔符--如果在开始时设置了
$
,则每个进一步的查询都应以
$$
结束,而不是以分号结束。

版本10.0.x StoredProcess的正确语法为:

DELIMITER //
DROP PROCEDURE IF EXISTS XXX.updateDoc_StorageID;
USE XXX;
CREATE OR REPLACE PROCEDURE XXX.updateDoc_StorageID () 
BEGIN
    DECLARE myTransacID INT DEFAULT 0; 
    DECLARE myTransProductId INT DEFAULT 0; 
    DECLARE myDocStoreID VARCHAR(500) DEFAULT '0'; 
    DECLARE my_count INT DEFAULT 0;
    DECLARE trans_csr CURSOR FOR SELECT 1,2 FROM MainTable ORDER BY TransactionID;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET my_count=1;
    SET my_count=0;
    OPEN trans_csr;
        trans_loop:LOOP
            FETCH trans_csr INTO myTransacID,myTransProductId;
          IF my_count=1 THEN
                   LEAVE trans_loop;
                END IF;
                If(myTransProductId=8)
                   then
                   if exists(....)
                   then
                           .......
                   end if;
                   elseif (myTransProductId=11) 
                   then
                   if exists(........)
                   then
                           .......
                   END IF;
            END IF;
        END LOOP trans_loop;
    CLOSE trans_csr;
    SET my_count=0;
END;
//
DELIMITER ;

版本10.0.x StoredProcess的正确语法为:

DELIMITER //
DROP PROCEDURE IF EXISTS XXX.updateDoc_StorageID;
USE XXX;
CREATE OR REPLACE PROCEDURE XXX.updateDoc_StorageID () 
BEGIN
    DECLARE myTransacID INT DEFAULT 0; 
    DECLARE myTransProductId INT DEFAULT 0; 
    DECLARE myDocStoreID VARCHAR(500) DEFAULT '0'; 
    DECLARE my_count INT DEFAULT 0;
    DECLARE trans_csr CURSOR FOR SELECT 1,2 FROM MainTable ORDER BY TransactionID;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET my_count=1;
    SET my_count=0;
    OPEN trans_csr;
        trans_loop:LOOP
            FETCH trans_csr INTO myTransacID,myTransProductId;
          IF my_count=1 THEN
                   LEAVE trans_loop;
                END IF;
                If(myTransProductId=8)
                   then
                   if exists(....)
                   then
                           .......
                   end if;
                   elseif (myTransProductId=11) 
                   then
                   if exists(........)
                   then
                           .......
                   END IF;
            END IF;
        END LOOP trans_loop;
    CLOSE trans_csr;
    SET my_count=0;
END;
//
DELIMITER ;

procedure.sql中有什么代码?我们这里没有玻璃球:)只添加了一部分,无法一次提供完整的代码。您的过程中有什么代码。sql?我们这里没有玻璃球:)只添加了一个片段,无法一次提供整个代码。按照您的建议修改后:错误是:第2行的错误1221(HY000):错误使用或替换和触发器/SP/EVENT
或REPLACE
在10.1中引入了过程子句,而您使用的是10.0。丢掉它,反正你也不需要它,因为你先放弃这个过程。在当前代码段中,您仍然没有固定的分隔符,您只是将
$$
替换为
/
,但同样的注释仍然适用——如果您将非分号设置为分隔符,您实际上应该将其用于以下语句,请帮助在codeYes中给出正确的语法,本页特别提到
或REPLACE
是在10.1.3中引入的,而您正在使用10.0。正如我所说,从
创建过程
语句中删除
或替换
子句;它不起作用。在运行时,它仍然给出错误:|第47行的错误1064(42000):您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解在“错误1304(42000):过程updateDoc_StorageID已存在”附近使用的正确语法。按照您的建议进行修改后:错误为:错误1221(HY000)第2行:在10.1中,当您使用10.0时,引入了错误使用或替换和触发器/SP/EVENT
或REPLACE
子句的过程。丢掉它,反正你也不需要它,因为你先放弃这个过程。在当前代码段中,您仍然没有固定的分隔符,您只是将
$$
替换为
/
,但同样的注释仍然适用——如果您将非分号设置为分隔符,您实际上应该将其用于以下语句,请帮助在codeYes中给出正确的语法,本页特别提到
或REPLACE
是在10.1.3中引入的,而您正在使用10.0。正如我所说,从
创建过程
语句中删除
或替换
子句;它不起作用。在运行时,它仍然给出错误:|第47行的错误1064(42000):您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,了解要使用的正确语法“错误1304(42000):过程updateDoc_StorageID已存在”