/*該代碼是建立了一個名叫"p4"的預存程序並設定了s1,s2,s3兩個int型一個varchar型參數,還可以是其他資料類型,內部建立了x1,x2兩個變數DELIMITER是修改分隔字元的DELIMITER $$的意思是把預設分隔符號";"換成"$$",這樣分段寫的預存程序就能整個被執行,而不是被當成多條sql語句單獨執行建立完過程再將分隔字元改回成";"兩種建立變數並賦值的方式SET @變數名 = 值;SELECT 值 INTO @變數名;使用變數前必須先運行該變數指派陳述式過程內部還可以通過 "DECLARE 變數名 類型(字串型要加範圍) DEFAULT 值;" 來建立變數,但如此建立的變數只能在該過程內部訪問預存程序只有三種型別參數 IN,OUT,INOUT調用過程時過程有幾個參數傳幾個參數,只是IN型的參數可以傳的是變數,可以是常量,而OUT和INOUT型的參數傳的必須是變數傳給out,inout參數的變數值會隨著在過程中改變在外部也改變,而給in參數的變數外部值則不受過程內變數值改變的影響*/DELIMITER $$DROP PROCEDURE IF EXISTS `p4`$$CREATE PROCEDURE `p4`(IN s1 INT,OUT s2 INT,INOUT s3 VARCHAR(10))BEGINDECLARE x1 VARCHAR(10) DEFAULT 'this is x1'; DECLARE x2 VARCHAR(10) DEFAULT 'this is x2'; SET s1 = 11;SET s2 = 22;SET s3 = 'iss3';/*if文法*/IF s1 = 11 AND s2 = 12 THENSELECT s1,s2;END IF;IF s3 = 's3' OR s1 = s2 THENSELECT s3;ELSE SELECT s1,s2,s3;END IF;/*case文法*/CASE s3WHEN 's1' THENSELECT 'this is s1';WHEN 's2' THENSELECT 'this is s2';ELSESELECT 'this is s3';END CASE;/*while迴圈*/WHILE s1>1 DOSET s1=s1-1;END WHILE; SELECT s1;/*repeat迴圈語句與while不同的是while滿足條件就執行,repeat始終執行直到滿足條件終止*/REPEAT SET s1 = s1-1; UNTIL s1=1 END REPEAT; SELECT s1;/*LOOP迴圈LOOP沒有迴圈條件,會不停的迴圈直到遇到 "LEAVE ZiDingYi;" "ZiDingYi"是自訂的LOOP標記*/ZiDingYi:LOOPSET s1 = s1+1;IF s1 = 5 THENLEAVE ZiDingYi;END IF;END LOOP;SELECT s1;END$$DELIMITER ;SET @p_in=1; SET @p_out=2;SET @p_inout = 's3';SELECT 'Hello World1' INTO @p_4;/*調用預存程序*/CALL p4(@p_in,@p_out,@p_inout);SELECT @p_in,@p_out,@p_inout,@p_4;/*預存程序如果只有一個語句則語句不用 begin...end包圍預存程序中可以直接使用外部定義的變數預存程序中用set和select定義的變數就是全域的,執行該過程後內部用set和select定義的變數外部可以訪問,其他過程也可以直接使用*/CREATE PROCEDURE p1() SET @var='p1'; CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@var); CALL p1(); CALL p2(); SELECT @var;CREATE PROCEDURE p3() SELECT CONCAT(@p3_var,' World');SET @p3_var='Hello';CALL p3();/*刪除預存程序*/DROP PROCEDURE p4;/*或者*/DROP PROCEDURE IF EXISTS `p4`/*查看該資料庫下有哪些預存程序 test為資料庫名*/SELECT NAME FROM mysql.proc WHERE db='test';/*或者*/SHOW PROCEDURE STATUS WHERE db='test';/*查看預存程序詳細資料,包括建立語句*/SHOW CREATE PROCEDURE p4;