MYSQL全庫查找指定字符串

jopen 8年前發布 | 30K 次閱讀 MySQL 數據庫服務器

DELIMITER //
DROP PROCEDURE IF EXISTS proc_FindStrInAllDataBase//

 CALL proc_FindStrInAllDataBase ('testdb','中');

CREATE PROCEDURE proc_FindStrInAllDataBase  (  IN para_databasename VARCHAR(128),  IN para_finstr VARCHAR(128)  ) BEGIN  -- 需要定義接收游標數據的變量   DECLARE tmp_dbname VARCHAR(128);  DECLARE tmp_tbname VARCHAR(128);  DECLARE tmp_colname VARCHAR(128);   -- 遍歷數據結束標志  DECLARE done INT DEFAULT FALSE;         -- 游標  DECLARE cur_db_tb CURSOR   FOR   SELECT     #*,   c.table_schema,c.table_name,c.COLUMN_NAME  FROM    information_schema.COLUMNS C   INNER JOIN information_schema.TABLES t ON c.TABLE_NAME=t.TABLE_NAME   WHERE   T.TABLE_TYPE='BASE TABLE'   AND    (c.data_type  LIKE '%char%'  OR c.data_type  LIKE '%text%')  AND    (C.TABLE_SCHEMA=para_databasename OR IFNULL(para_databasename,'') ='') AND IFNULL(para_finstr,'')<>'';     -- 將結束標志綁定到游標  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;  CREATE TEMPORARY TABLE IF NOT EXISTS rstb(dbname VARCHAR(128),tbname VARCHAR(128),colname VARCHAR(128),cnt INT);   -- 打開游標  OPEN cur_db_tb;    -- 開始循環    read_loop: LOOP    -- 提取游標里的數據,這里只有一個,多個的話也一樣;    FETCH cur_db_tb INTO  tmp_dbname,tmp_tbname,tmp_colname;    -- 聲明結束的時候    IF done THEN    LEAVE read_loop;    END IF;    -- 這里做你想做的循環的事件    SET @sqlstr=CONCAT('select count(1) into @rn from ',tmp_dbname,'.',tmp_tbname,' where ',tmp_colname,' like ''%',para_finstr,'%''');        PREPARE str FROM @sqlstr;      EXECUTE str;       DEALLOCATE PREPARE str;    IF IFNULL(@rn,0)>0     THEN     INSERT INTO rstb VALUES(tmp_dbname,tmp_tbname,tmp_colname,@rn);    END IF;

   END LOOP;  -- 關閉游標  CLOSE cur_db_tb;    SELECT * FROM rstb;  DROP TABLE rstb;   END // DELIMITER ;</pre>

來自: http://my.oschina.net/u/2604684/blog/603497

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!