MySQL сохраненная процедура, таблица INSERT INTO $ - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь создать хранимую процедуру, чтобы сначала создать таблицу, если она еще не существует. Эта часть функционирует, как и предполагалось:

    BEGIN
    SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS ',`@variable_table`,' LIKE table_template;');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

После создания таблицы или, если таблица уже существует, я хочу, чтобы сохраненная методика выгружала в нее набор данных.

    SET @sql = CONCAT('INSERT INTO ',`@variable_table`,' (
    `col1`,`col2`,`col3`,`col4`,`col5`)
    VALUES (
    `@D1`,`@D2`,`@D3`,`@D4`,`@D5`);');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    END

Если я заменяю ', @variable_table,' на существующее_имя_таблицы, код работает как задумано. Можно ли запустить код с переменной здесь, и в таком случае, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Оператор EXECUTE @stmt USING variable выглядит немного лучше:

BEGIN
SET @sql = CONCAT(
    'CREATE TABLE IF NOT EXISTS ',`@variable_table`,' LIKE table_template;'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @sql = CONCAT(
    'INSERT INTO ',`@variable_table`,
    ' (`col1`,`col2`,`col3`,`col4`,`col5`) VALUES (?,?,?,?,?);'
);

PREPARE stmt FROM @sql;
EXECUTE stmt USING @D1, @D2, @D3, @D4, @D5;
DEALLOCATE PREPARE stmt;
END;
0 голосов
/ 23 февраля 2020

Проработав методом проб и ошибок в течение последних нескольких часов, я обнаружил ошибки, и код теперь работает:

BEGIN
SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS ',`@variable_table`,' LIKE table_template;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @sql = CONCAT('INSERT INTO ',`@variable_table`,' (`col1`,`col2`,`col3`,`col4`,`col5`)
VALUES ("',`@D1`,'","',`@D2`,'","',`@D3`,'","',`@D4`,'","',`@D5`,'");');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

Мне кажется, что моя синтаксическая ошибка была в '', ` `," "область кода. Как вы можете видеть, единственное изменение, которое я сделал, это поместил переменные @D1 вне текста и добавил их внутри текста по обе стороны от переменных.

...