【问题标题】:mysql prepared statement unable to execute. Getting error 1064mysql 准备好的语句无法执行。收到错误 1064
【发布时间】:2015-01-04 07:16:01
【问题描述】:
DELIMITER $$

DROP PROCEDURE IF EXISTS TOUR_TRANSFER $$

CREATE PROCEDURE TOUR_TRANSFER(in_search CHAR(80),tbl CHAR(80),clmn CHAR(80))
BEGIN
DECLARE selstmt,sel_cmd VARCHAR(100);
BEGIN -- for rubric table
        SET selstmt=concat('SELECT ',clmn,' INTO @tbl_data FROM ',tbl,' WHERE ',clmn, ' REGEXP "', in_search,'"');
        select selstmt;
        PREPARE sel_cmd FROM @selstmt;
        EXECUTE sel_cmd;
        select @tbl_data;
        DEALLOCATE PREPARE sel_cmd;
END;
END$$
DELIMITER ;

我在准备语句中遇到错误 (1064),而我可以手动执行它。

【问题讨论】:

  • 你遇到了什么错误?
  • 另外,请分享您的代码 - 也许您在代码方面有错误,而不是在 SQL 方面。

标签: mysql


【解决方案1】:

一些语法问题。现在试试这个

DELIMITER //
DROP PROCEDURE IF EXISTS TOUR_TRANSFER;
//
CREATE PROCEDURE TOUR_TRANSFER(in_search CHAR(80),tbl CHAR(80),clmn CHAR(80))
BEGIN
DECLARE selstmt, tbl_data, sel_cmd VARCHAR(100);
SET @selstmt=concat('SELECT ',clmn,' INTO @tbl_data FROM ',tbl,' WHERE ',clmn, '   REGEXP "', in_search,'"');
select @selstmt;
PREPARE sel_cmd FROM @selstmt;
EXECUTE sel_cmd;
select @tbl_data;
DEALLOCATE PREPARE sel_cmd;
END;
//
DELIMITER ;

【讨论】:

  • 我收到同样的错误 \n 13:33:10 call TOUR_TRANSFER('avinash','user','name') 错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“NULL”附近使用正确的语法
  • prepare 语句中存在一些问题,我可以创建没有任何语法错误的过程,但由于抛出 1064 错误而无法调用它
【解决方案2】:

这是因为您的代码中存在语法错误。 Befin 语句应该有一个 end 并且从您的代码中 end 语句被注释掉,请参见下面的示例代码

DELIMITER $$;

DROP PROCEDURE IF EXISTS TOUR_TRANSFER $$;

CREATE PROCEDURE TOUR_TRANSFER(in_search CHAR(80),tbl CHAR(80),clmn CHAR(80)) BEGIN DECLARE selstmt,sel_cmd VARCHAR(100); 
BEGIN 
-- for rubric table SET selstmt=concat('SELECT ',clmn,' INTO @tbl_data FROM ',tbl,' WHERE ',clmn, ' REGEXP "', in_search,'"'); select selstmt; PREPARE sel_cmd FROM @selstmt; EXECUTE sel_cmd; select @tbl_data; DEALLOCATE PREPARE sel_cmd; 
END; END$$ DELIMITER 

在您的代码上添加一个新行,它应该可以正常工作。

【讨论】:

  • 当我在创建存储过程后调用它时,我会得到一个使用 'SET selstmt=concat('SELECT ',clmn,' INTO @tbl_data FROM ',tbl,' WHERE ', clmn, ' REGEXP "', in_search,'"');选择 selstmt;' 代码中的行。如果我手动(单独)执行生成的语句,它运行良好,但它不在存储过程中运行
【解决方案3】:

交换前两行并将它们更改为如下所示。您想先删除该过程,然后为您的存储过程设置分隔符。

DROP PROCEDURE IF EXISTS TOUR_TRANSFER;

DELIMITER $$

您似乎还有一组额外的 BEGINEND 语句。您可以删除内部的。

这会让你的代码看起来像这样。

DROP PROCEDURE IF EXISTS TOUR_TRANSFER;

DELIMITER $$

CREATE PROCEDURE TOUR_TRANSFER(in_search CHAR(80),tbl CHAR(80),clmn CHAR(80))
BEGIN
DECLARE selstmt,sel_cmd VARCHAR(100);
        SET selstmt=concat('SELECT ',clmn,' INTO @tbl_data FROM ',tbl,' WHERE ',clmn, ' REGEXP "', in_search,'"');
        select selstmt;
        PREPARE sel_cmd FROM @selstmt;
        EXECUTE sel_cmd;
        select @tbl_data;
        DEALLOCATE PREPARE sel_cmd;
END

$$

DELIMITER ;

这是另一个与在存储过程中使用准备好的语句相关的问题的链接。请参阅答案以获取示例。

MySQL PREPARE statement in stored procedures

【讨论】:

  • 如果我删除DROP PROCEDURE IF EXISTS TOUR_TRANSFER $$ 行上的$$,我得到一个语法错误新代码是DELIMITER $$ DROP PROCEDURE IF EXISTS TOUR_TRANSFER $$ CREATE PROCEDURE TOUR_TRANSFER(in_search CHAR(80),tbl CHAR(80),clmn CHAR(80)) BEGIN DECLARE selstmt,sel_cmd VARCHAR(100); SET selstmt=concat('SELECT ',clmn,' INTO @tbl_data FROM ',tbl,' WHERE ',clmn, ' REGEXP "', in_search,'"'); select selstmt; PREPARE sel_cmd FROM @selstmt; EXECUTE sel_cmd; select @tbl_data; DEALLOCATE PREPARE sel_cmd; END$$ DELIMITER ; call TOUR_TRANSFER('avinash','user','name')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2019-11-04
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多