#sql #mariadb #syntax-error #prepared-statement
Вопрос:
Я столкнулся с этой ошибкой при попытке восстановить дамп базы данных в базу данных MariaDB:
ERROR 1064 (42000) at line 1234: 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 'v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_sql = CONCAT('DROP TABLE IF' at line 7
Ознакомившись с синтаксисом SQL, я пришел к выводу , что сбой произошел из-за инструкции SET, в которой определяемому пользователем имени переменной не предшествует an @
, как это должно быть. Но зачем mysqldump
вообще генерировать такое заявление?
Оператор, используемый для создания дампа, является
mysqldump -u... -p... --single-transaction --routines --triggers --all-databases > dump.sql
с
mysqldump Ver 10.19 Distrib 10.5.11-MariaDB, for debian-linux-gnu (x86_64)
а затем восстановил на
mariadb Ver 15.1 Distrib 10.1.48-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Полное определение из дампа-это:
DELIMITER ;;
CREATE DEFINER=`mydefiner`@`%` PROCEDURE `p_my_procedure`(
IN `myid` VARCHAR(36)
)
BEGIN
DECLARE v_sql TEXT;
SET v_sql = CONCAT('DROP TABLE IF EXISTS ', '`prefix_',myid,'_one`;');
PREPARE stmt FROM v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_sql = CONCAT('DROP TABLE IF EXISTS ','`prefix_',myid,'_two`;');
PREPARE stmt FROM v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_sql = CONCAT('DROP TABLE IF EXISTS ','`other_prefix_',myid,'`;');
PREPARE stmt FROM v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END ;;
Комментарии:
1. Предоставьте тексты SP из ПРОЦЕДУРЫ СОЗДАНИЯ и из дампа.
2. И где те же определения, полученные из заявлений SHOW? Инструкции из дампа явно ошибочны и противоречат документации , в которой утверждается, что » preparable_stmt является либо строковым литералом, либо пользовательской переменной ( не локальной переменной , выражением SQL или подзапросом), содержащей текст инструкции».
3. Целевой сервер @danblack 10.1.48-MariaDB, и он не поддерживает
execute immediate
.4. Я не думаю, что это был mysqldump, который опустил знак @ в имени переменной! Операторы Declare используются для локальных переменных, а не для пользовательских переменных.
5. Похоже, что дамп был создан на сервере > 10.1.48 (вы используете mysqldump из пакета 10.5 server). Также подумайте об обновлении, 10.1 является eoled.