ошибка в вашем синтаксисе SQL, версия сервера MariaDB для правильного синтаксиса для использования рядом с ‘CREATE PROCEDURE pro ()

#sql #stored-procedures #mariadb #sql-insert #recursive-query

#sql #хранимые процедуры #mariadb #sql-вставка #рекурсивный запрос

Вопрос:

 DELIMITER $
use adventureworks
CREATE PROCEDURE pro()
BEGIN
    DECLARE i int DEFAULT 0;
    
    WHILE i <= 50 DO
        INSERT INTO salesorderheader(SalesOrderID, RevisionNumber, OrderDate)
        VALUES (i, 1, "2001-07-01 00:00:00");
        SET i = i   1;
    END WHILE;
END $
call pro()
DELIMITER ;
 

Комментарии:

1. Работает для меня, используя последнюю версию MariaDB 10.5. Какую версию вы используете?

Ответ №1:

Вам нужен завершитель после каждого оператора. В use call операторе and его нет.

Вы переключаете разделитель в начале вашего скрипта, поэтому синтаксис будет:

 delimiter $

use adventureworks$

create procedure pro()
begin 
    ...
end$

call pro()$

delimiter ;
 

Более типичным подходом является изменение разделителя только для определения процедуры:

 use adventureworks;

delimiter $
create procedure pro()
begin 
    ...
end$
delimiter ;

call pro();
 

Примечание: если вы используете MariaDB 10.3 или выше, вы можете использовать рекурсивный запрос вместо цикла:

 insert into salesorderheader(SalesOrderID, RevisionNumber, OrderDate)
with cte as (
    select 1 as i 
    union all select i   1 from cte where i < 50
)
select i, 1, '2001-07-01'
from cte