【问题标题】:Mysql insert from stored procedure gives error 1064从存储过程插入Mysql给出错误1064
【发布时间】:2014-06-23 05:08:26
【问题描述】:

由于某些奇怪的原因,从存储过程插入不起作用。 这就是我想要做的:

DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS  test(
id                                          INT(9)                  NOT NULL AUTO_INCREMENT
,name                                       VARCHAR(30)     NOT NULL 
,PRIMARY KEY (id)

) 默认字符集=utf8; 插入测试(名称)值('A');

从命令行插入没有问题。

然后我创建了一个存储过程来执行相同类型的插入:

DROP PROCEDURE IF EXISTS storedtest;
DELIMITER $$
CREATE PROCEDURE storedtest()
    BEGIN
        declare insert_sql varchar(200);
        SET insert_sql = 'insert into test (name) values(3)';
        SELECT insert_sql;
        PREPARE mystm FROM @insert_sql;
        EXECUTE mystm;
   END$$
DELIMITER ;

call storedtest();

这给了我错误: ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“NULL”附近使用正确的语法

空? NULL 是从哪里来的?

我也试过把sql-insert改成这样(不知道是不是好办法):

    SET insert_sql = "insert into test (name) values('3')";

但是 mysql 给了我完全相同的错误。 有人知道吗?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    MySQL 报告的NULL 是一个空的用户变量@insert_sql,它不同于您使用DECLARE 分配的本地存储过程本地变量insert_sql

    MySQL 的 DECLARE 用于存储程序的本地变量,but according to the documentationPREPARE stmt FROM ... 需要字符串文字或 用户变量,它们是前面带有 @ 的类型.

    准备 stmt_name 来自 preparable_stmt

    preparable_stmt 是字符串文字或包含 SQL 语句文本的用户变量。

    您可以使用SET 分配无类型的用户变量,因此不需要DECLARE。完成后,您可能希望将其设置为 NULL

    DROP PROCEDURE IF EXISTS storedtest;
    DELIMITER $$
    CREATE PROCEDURE storedtest()
    BEGIN
      -- Just SET the user variable
      SET @insert_sql = 'insert into test (name) VALUES (3)';
      SELECT @insert_sql;
    
      -- Prepare & execute
      PREPARE mystm FROM @insert_sql;
      EXECUTE mystm;
      
      -- Deallocate the statement and set the var to NULL
      DEALLOCATE PREPARE mystm;
      SET @insert_sql = NULL;
    END$$
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2011-04-18
      相关资源
      最近更新 更多