【mysql】存儲過程無參,傳入參數,傳出參數,動態sql,游標的簡單例子


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;
View Code

 

 

 

 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

      https://blog.csdn.net/Peacock__/article/details/83030476


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM