1、首先看數據庫數據

2、無參存儲過程
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(無參) CREATE PROCEDURE proc1() BEGIN -- 4.執行指定sql SELECT COUNT(*) FROM t1 t WHERE t.name LIKE '%1%'; END -- 5.結束 & -- 6.將mysql分隔符從;設置為; DELIMITER ; -- 7.調用存儲過程 CALL proc1(); -- 8.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;

3、傳入參數
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(傳入參數,類型字符串) CREATE PROCEDURE proc1(IN n CHAR) BEGIN -- 4.執行指定sql SELECT COUNT(*) FROM t1 t WHERE t.name LIKE CONCAT('%',n,'%'); END -- 5.結束 & -- 6.將mysql分隔符從;設置為; DELIMITER ; -- 7.設置變量 SET @name='1'; -- 8.調用存儲過程,傳入參數 CALL proc1(@name); -- 9.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;

4、傳入傳出參數
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(傳入參數,類型字符串。傳出參數,類型整型) CREATE PROCEDURE proc1(IN n CHAR, OUT c INT) BEGIN -- 4.執行指定sql(into就是把數據放到指定變量里,這里就是放到c) SELECT COUNT(*) INTO c FROM t1 t WHERE t.name LIKE CONCAT('%',n,'%'); END -- 5.結束 & -- 6.將mysql分隔符從;設置為; DELIMITER ; -- 7.設置變量 SET @name='1'; SET @count=0; -- 8.調用存儲過程,傳入傳出參數 CALL proc1(@name, @count); -- 9.打印 SELECT @count; -- 10.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;

5、動態sql(無參)
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(無參) CREATE PROCEDURE proc1() BEGIN -- 4.聲明變量 DECLARE $sqltext VARCHAR(1000); -- 5.動態sql SET $sqltext = 'SELECT COUNT(*) FROM t1 t where t.name like \'%1%\';'; -- 一直需要這,不然會報錯,目前沒有找到資料 SET @sqlcounts := $sqltext; -- 6.預編釋,stmt預編釋變量的名稱 PREPARE stmt FROM @sqlcounts; -- 7.執行SQL語句 EXECUTE stmt; -- 8.釋放資源 DEALLOCATE PREPARE stmt; END -- 9.結束 & -- 10.將mysql分隔符從;設置為; DELIMITER ; -- 11.調用存儲過程,無參 CALL proc1(); -- 12.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;

6、動態sql,傳入傳出參數
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(傳入參數,類型字符串。傳出參數,類型整型) CREATE PROCEDURE proc1(IN n CHAR, OUT s INT) BEGIN -- 4.聲明變量 DECLARE $sqltext VARCHAR(1000); -- 5.動態sql,把sql返回值放到@ret_date中 SET $sqltext = CONCAT('SELECT COUNT(*) into @ret_date FROM t1 t where t.name like \'%', n, '%\''); -- 一直需要這,不然會報錯,目前沒有找到資料 SET @sqlcounts := $sqltext; -- 6.預編釋,stmt預編釋變量的名稱 PREPARE stmt FROM @sqlcounts; -- 7.執行SQL語句 EXECUTE stmt; -- 8.釋放資源 DEALLOCATE PREPARE stmt; -- 9.獲取動態SQL語句返回值 SET s = @ret_date; END -- 10.結束 & -- 11.將mysql分隔符從;設置為; DELIMITER ; -- 12.設置變量 SET @name='1'; SET @count=0; -- 13.調用存儲過程,傳入傳出參數 CALL proc1(@name, @count); -- 14.打印 SELECT @count; -- 15.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;

7、游標,返回指定數據庫的所有列信息(數據庫名,表名,列名)
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(傳出參數,類型字符串) CREATE DEFINER=`root`@`localhost` PROCEDURE proc1(OUT str VARCHAR(2000)) BEGIN -- 4.聲明變量 DECLARE database_name, table_name, column_name CHAR(200); DECLARE resoult_s VARCHAR(2000) DEFAULT ''; -- 5.定義游標結束標識,默認為0 DECLARE stopflag INT DEFAULT 0; -- 6.定義游標,其實就是臨時存儲sql返回的集合 DECLARE sql_resoult CURSOR FOR SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.COLUMN_NAME FROM information_schema.COLUMNS t WHERE t.TABLE_SCHEMA='my_test'; -- 7.游標結束就設置為1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1; -- 8.打開游標 OPEN sql_resoult; -- 9.讀取游標中數據,存儲到指定變量 FETCH sql_resoult INTO database_name, table_name, column_name; -- 10.沒有結束繼續往下走 WHILE stopflag=0 DO BEGIN -- 11.拼接字符串,不可直接用傳出變量設值 IF (resoult_s IS NULL OR resoult_s='') THEN SET resoult_s=CONCAT(database_name, ',', table_name, ',', column_name); ELSE SET resoult_s=CONCAT(resoult_s, ';', database_name, ',', table_name, ',', column_name); END IF; -- 12.讀取游標中數據,存儲到指定變量。(和9一樣) FETCH sql_resoult INTO database_name, table_name, column_name; END; END WHILE; -- 13.關閉游標 CLOSE sql_resoult; -- 14.把數據放到傳出參數 SET str=resoult_s; END -- 15.結束 & -- 16.將mysql分隔符從;設置為; DELIMITER ; -- 17.設置變量 SET @str=''; -- 18.調用存儲過程 CALL proc1(@str); -- 19.打印 SELECT @str; -- 20.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;
或者
-- 1.將mysql分隔符從;設置為& DELIMITER & -- 2.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS `proc1` & -- 3.定義存儲過程(傳出參數,類型字符串) CREATE DEFINER=`root`@`localhost` PROCEDURE proc1(IN database_n CHAR(20), OUT str VARCHAR(2000)) BEGIN -- 4.聲明變量 DECLARE database_name, table_name, column_name CHAR(200); DECLARE resoult_s VARCHAR(2000) DEFAULT ''; -- 5.定義游標結束標識,默認為0 DECLARE stopflag INT DEFAULT 0; -- 6.定義游標,其實就是臨時存儲sql返回的集合 DECLARE sql_resoult CURSOR FOR SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.COLUMN_NAME FROM information_schema.COLUMNS t; -- 7.游標結束就設置為1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1; -- 8.打開游標 OPEN sql_resoult; -- 9.讀取游標中數據,存儲到指定變量 FETCH sql_resoult INTO database_name, table_name, column_name; -- 10.沒有結束繼續往下走 WHILE (stopflag=0) DO BEGIN IF (database_name=database_n) THEN -- 11.拼接字符串,不可直接用傳出變量設值 IF (resoult_s IS NULL OR resoult_s='') THEN SET resoult_s=CONCAT(database_name, ',', table_name, ',', column_name); ELSE SET resoult_s=CONCAT(resoult_s, ';', database_name, ',', table_name, ',', column_name); END IF; END IF; -- 12.讀取游標中數據,存儲到指定變量。(和9一樣) FETCH sql_resoult INTO database_name, table_name, column_name; END; END WHILE; -- 13.關閉游標 CLOSE sql_resoult; -- 14.把數據放到傳出參數 SET str=resoult_s; END -- 15.結束 & -- 16.將mysql分隔符從;設置為; DELIMITER ; -- 17.設置變量 SET @str=''; SET @database='my_test'; -- 18.調用存儲過程 CALL proc1(@database, @str); -- 19.打印 SELECT @str; -- 20.如果存在存儲過程proc1則刪除 DROP PROCEDURE IF EXISTS proc1;

my_test,t1,name;my_test,t1,city;my_test,t_user,id;my_test,t_user,user_name;my_test,t_user,user_password;my_test,test_replace,id;my_test,test_replace,name;my_test,test_replace,password

參考文章:https://www.cnblogs.com/end/archive/2011/04/01/2002662.html
