【问题标题】:MySQL stored prosedure, INSERT INTO $tableMySQL 存储过程,INSERT INTO $table
【发布时间】:2020-06-07 09:35:27
【问题描述】:

我正在尝试创建一个存储过程来首先创建一个表,如果它不存在的话。这部分功能符合预期:

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

创建表后,或者如果表已经存在,我希望存储的 proseadure 转储其中的一组数据。

    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,' 与 existing_table_name 交换,代码将按预期工作。 是否可以在这里使用变量运行代码,在这种情况下,我该怎么做?

【问题讨论】:

  • 您忘记提及现有代码所面临的问题。
  • @stickybit 对不起,它返回了一条语法错误消息并要求我检查文档。
  • Edit 问题并将该消息包含为文本,没有屏幕截图。

标签: mysql stored-procedures set sql-insert concat


【解决方案1】:

EXECUTE @stmt USING variables 语句看起来要好一些:

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;

【讨论】:

  • 是的,确实如此。谢谢你!
【解决方案2】:

在过去几个小时反复试验后,我发现了错误,代码现在可以工作了:

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 变量放在“文本”之外,并在变量两侧的文本中添加“。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2016-06-15
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2011-12-04
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多