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 ;
我在prepare语句中收到错误(1064),而我能够手动执行它。
答案 0 :(得分:0)
交换前两行并将其更改为如下所示。您希望先删除该过程,然后为存储过程设置分隔符。
DROP PROCEDURE IF EXISTS TOUR_TRANSFER;
DELIMITER $$
您似乎还有一组额外的BEGIN
和END
语句。你可以删除内部的。
这会使你的代码看起来像这样。
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 ;
这是指向在存储过程中使用预准备语句的另一个问题的链接。请参阅答案以获取示例。
答案 1 :(得分:0)
这是因为您的代码中存在语法错误。 Befin语句应该结束,并且从你的代码中注释出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
在代码上添加一个新行,它应该可以正常工作。
答案 2 :(得分:0)
一些句法问题。现在试试这个
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 ;