С точкой с запятой в теле процедуры, нам нужно изменить разделитель операторов для сеанса.
Например:
DELIMITER $$
CREATE PROCEDURE foo()
BEGIN
SELECT NOW();
END$$
DELIMITER ;
При этом точка с запятой, которая появляется вхранимая процедура не завершает оператор CREATE
.И мы можем изменить разделитель операторов обратно на точку с запятой, когда закончим.
РЕДАКТИРОВАТЬ
Вот анализ сообщенного вывода:
Этот оператор
DROP PROCEDURE IF EXISTS EXEC_DDL;
выполнен успешно, выдав предупреждение «процедура не существует»
Следующий выполненный оператор был следующим:
CREATE DEFINER=`ampd_own`@`%`
PROCEDURE `ampd01`.`EXEC_DDL`(in SQLSTMT VARCHAR(4000))
BEGIN
set @sql = SQLSTMT;
MySQL вернул aошибка синтаксиса;что является ожидаемым поведением, потому что это не допустимый оператор SQL.Выполнение следующего оператора:
PREPARE STMT FROM @sql;
вернуло ошибку, поскольку @sql
оценивается как NULL
.Следующий выполненный оператор
EXECUTE STMT;
не выполнен, поскольку STMT не является допустимым дескриптором оператора.(Потому что PREPARE не удалось.)
Мы не хотим выполнять SET
и PREPARE
как отдельные операторы, мы хотим, чтобы они были частью оператора CREATE PROCEDURE
.
Проблема в том, что точка с запятой является оператором-терминатором;нам нужно изменить терминатор оператора, чтобы он был чем-то другим, на какую-то строку, которая не отображается в теле CREATE PROCEDURE
.
FOLLOWUP
Ссылка: https://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html
Вот демонстрация с использованием клиента командной строки MySQL
# mysql --defaults-extra-file=/opt/mysql/scripts/config.cnf --database test
mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS foo $$
Query OK, 0 rows affected (0.06 sec)
mysql> DROP PROCEDURE IF EXISTS foo $$
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE PROCEDURE foo()
-> BEGIN
-> SELECT NOW();
-> END$$
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL foo();
+---------------------+
| NOW() |
+---------------------+
| 2018-06-13 13:33:33 |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> exit