2010-03-24 63 views
0

此存儲過程用於搜索數據庫中的所有表和列。存儲過程中的Mysql錯誤

DELIMITER $$ 
DROP PROCEDURE IF EXISTS get_table $$ 
CREATE 
    /*[DEFINER = { user | CURRENT_USER }]*/ 
    PROCEDURE `auradoxdb`.`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 (‘information_schema’,'test’,'mysql’); 

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 tablehhh 
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 ; 

出現下列錯誤時,執行這個..

Error Code : 1064 
You have an error in your SQL syntax; check the manual that corresponds to 
your MySQL server version for the right syntax to use near 'SELECT COUNT(*) 
INTO @CNT_VALUE FROM `’,table_schema,’`.`’,table_name,’`' at line 12 
(0 ms taken) 

可以任何機構請幫我解決這個問題?

回答

2

看來您正試圖爲每個表動態構建一條SQL語句。爲此,您需要將文本部分引用爲正常字符串並連接動態部分。用以下替換查詢應該工作:

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 ('information_schema','test','mysql');