В MySql, как вы можете подготовить и выполнить процедуру создания

Я пытаюсь создать хранимую процедуру MySql с помощью оператора Prepare/Execute и получаю сообщение об ошибке. Я не понимаю, какой синтаксис я нарушаю.

SET @SourceDBName='dev';
    SET @alterstatement=CONCAT('DELIMITER //
    CREATE PROCEDURE ',@SourceDBName,'.execute_statement (alterstatement VARCHAR (767)) 
    BEGIN
        SELECT @alterstatement; 
        PREPARE executionstatement FROM @alterstatement; 
        EXECUTE executionstatement;
        END //');
    SELECT @alterstatement;
    PREPARE executionstatement FROM @alterstatement;
    EXECUTE executionstatement;

Я получаю общую синтаксическую ошибку:

09:43:20    PREPARE executionstatement FROM @alterstatement Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //         CREATE PROCEDURE dev.execute_statement (alterstatement VARC' at line 1    0.086 sec

Может кто-нибудь сказать мне, что я делаю неправильно? Я пробовал устранять неполадки, но пока не разобрался.


person Huckleberry    schedule 27.03.2017    source источник
comment
DELIMITER — это команда официальной утилиты командной строки. Вы не можете использовать его в другом месте.   -  person Álvaro González    schedule 27.03.2017
comment
Значит, вы не можете создать хранимую процедуру с помощью Execute?   -  person Huckleberry    schedule 27.03.2017
comment
Я печатал правильный ответ, пока вы читали это.   -  person Álvaro González    schedule 27.03.2017


Ответы (1)


DELIMITER — это команда официальной утилиты командной строки. Вы не можете использовать его в другом месте.

В вашем случае он вам все равно не нужен. PREPAREоператор не принимает несколько операторов:

Текст должен представлять собой одно утверждение, а не несколько утверждений.

... так что нет необходимости в разделителях. Однако вы получите эту ошибку:

Эта команда еще не поддерживается в протоколе подготовленного оператора

... потому что CREATE PROCEDURE явно не поддерживается еще:

Следующие операторы SQL могут использоваться как подготовленные операторы:

[...]

{CREATE | DROP} INDEX
{CREATE | RENAME | DROP} DATABASE
{CREATE | DROP} TABLE
{CREATE | RENAME | DROP} USER
{CREATE | DROP} VIEW
person Álvaro González    schedule 27.03.2017
comment
Спасибо за объяснение! - person Huckleberry; 27.03.2017