2010-04-01 143 views
0

这是我的存储过程,用于搜索所有数据库,表和列。 此过程是在没有任何错误的情况下创建的。调用Mysql时出错存储过程

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `mydb`.`get_table`$$ 

CREATE DEFINER=`root`@`%` PROCEDURE `get_table`(in_search varchar(50)) 
    READS SQL DATA 
BEGIN 
DECLARE trunc_cmd VARCHAR(50); 
DECLARE search_string VARCHAR(250); 
DECLARE db,tbl,clmn CHAR(50); 
DECLARE done INT DEFAULT 0; 
DECLARE COUNTER INT; 
DECLARE table_cur CURSOR FOR 
SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM ', 
       table_schema,'.', table_name, 
       ' WHERE ', column_name,' REGEXP ''',in_search,'''' 
     ) 
,table_schema,table_name,column_name 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA NOT IN ('mydb','information_schema'); 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 
# #Truncating table for refill the data for new search. 
PREPARE trunc_cmd FROM 'TRUNCATE TABLE temp_details'; 
EXECUTE trunc_cmd ; 
OPEN table_cur; 
table_loop:LOOP 
FETCH table_cur INTO search_string,db,tbl,clmn; 
# #Executing the search 
SET @search_string = search_string; 
SELECT search_string; 
PREPARE search_string FROM @search_string; 
EXECUTE search_string; 
SET COUNTER = @CNT_VALUE; 
SELECT COUNTER; 
IF COUNTER>0 THEN 
# # Inserting required results from search to table 
INSERT INTO temp_details VALUES(db,tbl,clmn); 
END IF; 
IF done=1 THEN 
LEAVE table_loop; 
END IF; 
END LOOP; 
CLOSE table_cur; 
# #Finally Show Results 
SELECT * FROM temp_details; 
END$$ 

DELIMITER ; 

但是,当调用此过程时发生以下错误。

call get_table('aaa') 

错误代码:1064你有 您的SQL语法错误;检查手册中 相当于你的MySQL服务器 版本正确的语法在1号线 使用 附近“删除REGEXP'AAA”(取0毫秒)

回答

1

哪里“删除”从何而来?你有那个名字的column_name吗?如果是这样,用更好的名字,不保留的,或者使用肮脏的反引号`或ANSI引号“周围的列名。

建设这样很容易受到SQL注入。

+0

不知道在哪里‘删除’来自。 我尝试了专有名称,但也发生了同样的错误。我也反引用'和ANSI引号“,但没有解决问题 – devuser 2010-04-01 05:34:02