MySql_ procedure


 

返回參數示例

下面是一個示例:

delimiter //S                                                                                                                                                                                                                                                                                                   

drop procedure if EXISTS myzrz;

CREATE PROCEDURE myzrz(in pin int,out pout int, INOUT pinout int)
begin
declare var int ;
set var =0;

while var<6 DO
INSERT into test.test values (null,var,var,var);
set var=var+1;
end while;
end;
//

調用語法示例


Set @a=6;
set @b=6;
call myzrz(6,6,@b);

 

1 調用的時候 out 類型的參數和 inout 的參數必須指定為用戶變量  如 @a,@b來做參數;

IN 類型的參數 雖然在存儲過程中被修改,但並不影響@p_in的值,注意這點;

 

 

Ⅱ. 變量賦值

 SET 變量名 = 表達式值 [,variable_name = expression ...]

 

 

Ⅲ. 用戶變量

 

ⅰ. 在MySQL客戶端使用用戶變量

mysql > SELECT 'Hello World' into @x;  

mysql > SELECT @x;  

+-------------+  

|   @x        |  

+-------------+  

| Hello World |  

+-------------+  

mysql > SET @y='Goodbye Cruel World';  

mysql > SELECT @y;  

+---------------------+  

|     @y              |  

+---------------------+  

| Goodbye Cruel World |  

+---------------------+  

 

mysql > SET @z=1+2+3;  

mysql > SELECT @z;  

+------+  

| @z   |  

+------+  

|  6   |  

+------+  

ⅱ. 在 存儲過程中使用用戶變量

 

mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  

mysql > SET @greeting='Hello';  

mysql > CALL GreetWorld( );  

+----------------------------+  

| CONCAT(@greeting,' World') |  

+----------------------------+  

|  Hello World               |  

+----------------------------+  

 

ⅲ. 在存儲過程間傳遞全局范圍的用戶變量

mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1';  

mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);  

mysql> CALL p1( );  

mysql> CALL p2( );  

+-----------------------------------------------+  

| CONCAT('Last procedure was ',@last_proc       |  

+-----------------------------------------------+  

| Last procedure was p1                         |  

+-----------------------------------------------+  

 

 

注意:

①用戶變量名一般以@開頭

②濫用用戶變量會導致程序難以理解及管理

 

(5). 注釋

 

MySQL存儲過程可使用兩種風格的注釋

雙模杠:--

該風格一般用於單行注釋

c風格: 一般用於多行注釋

例如:

 

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc1 --name存儲過程名  

     -> (IN parameter1 INTEGER)  

     -> BEGIN  

     -> DECLARE variable1 CHAR(10);  

     -> IF parameter1 = 17 THEN  

     -> SET variable1 = 'birds';  

     -> ELSE 

     -> SET variable1 = 'beasts';  

     -> END IF;  

     -> INSERT INTO table1 VALUES (variable1);  

     -> END  

     -> //  

mysql > DELIMITER ;  

 

4.      MySQL存儲過程的調用

用call和你過程名以及一個括號,括號里面根據需要,加入參數,參數包括輸入參數、輸出參數、輸入輸出參 數。具體的調用方法可以參看上面的例子。

 

5.      MySQL存儲過程的查詢

我們像知道一個數據庫下面有 那些表,我們一般采用show tables;進行查看。那么我 們要查看某個數據庫下面的存儲過程,是否也可以采用呢?答案是,我們可以查看某個數據庫下面的存儲過程,但是是令一鍾方式。

我們可以用

select name from mysql.proc where db=’數據庫名’;

或者

select routine_name from information_schema.routines where routine_schema='數據庫名';

或者

show procedure status where db='數據庫名';

進行查詢。

如果我們想知道,某個存儲過程的詳細,那我們又該怎么做呢?是不是也可以像操作表一樣用describe 表名進行查看呢?

答案是:我們可以查看存儲過程的詳細,但是需要用另一種方法:

SHOW CREATE PROCEDURE 數據庫.存儲過程名;

就可以查看當前存儲過程的詳細。

 

6.      MySQL存儲過程的修改

ALTER PROCEDURE

更改用CREATE PROCEDURE 建 立的預先指定的存儲過程,其不會影響相關存儲過程或存儲功能。

 

7.      MySQL存儲過程的刪除

刪除一個存儲過程比較簡單, 和刪除表一樣:

DROP PROCEDURE

從MySQL的表格中刪除一個或多個 存儲過程。

 

8.      MySQL存儲過程的控制語句

(1). 變量作用域

內部的變量在其作用域范圍內享有更高的優先權,當執行到end。變量時,內部變量消失,此時已經在其作用域外,變量不再可見了,應為在存儲

過 程外再也不能找到這個申明的變量,但是你可以通過out參數或者將其值指派

給 會話變量來保存其值。

 

 

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc3()  

     -> begin 

     -> declare x1 varchar(5) default 'outer';  

     -> begin 

     -> declare x1 varchar(5) default 'inner';  

     -> select x1;  

     -> end;  

     -> select x1;  

     -> end;  

     -> //  

mysql > DELIMITER ;  

 

 (2). 條件語句

Ⅰ. if-then -else語句

 

 

 

 

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc2(IN parameter int)  

     -> begin 

     -> declare var int;  

     -> set var=parameter+1;  

     -> if var=0 then 

     -> insert into t values(17);  

     -> end if;  

     -> if parameter=0 then 

     -> update t set s1=s1+1;  

     -> else 

     -> update t set s1=s1+2;  

     -> end if;  

     -> end;  

     -> //  

mysql > DELIMITER ;  

 

Ⅱ. case語句: 

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc3 (in parameter int)  

     -> begin 

     -> declare var int;  

     -> set var=parameter+1;  

     -> case var  

     -> when 0 then   

     -> insert into t values(17);  

     -> when 1 then   

     -> insert into t values(18);  

     -> else   

     -> insert into t values(19);  

     -> end case;  

     -> end;  

     -> //  

mysql > DELIMITER ; 

 

(3). 循環語句

Ⅰ. while ···· end while:

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc4()  

     -> begin 

     -> declare var int;  

     -> set var=0;  

     -> while var<6 do  

     -> insert into t values(var);  

     -> set var=var+1;  

     -> end while;  

     -> end;  

     -> //  

mysql > DELIMITER ; 

 

 

Ⅱ. repeat···· end repeat:

它在執行操作后檢查結果,而while則是執行前進行檢 查。

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc5 ()  

     -> begin   

     -> declare v int;  

     -> set v=0;  

     -> repeat  

     -> insert into t values(v);  

     -> set v=v+1;  

     -> until v>=5  

     -> end repeat;  

     -> end;  

     -> //  

mysql > DELIMITER ;  

 

 

Ⅲ. loop ·····end loop:

loop循環不需要初始條件,這點和while 循環相似,同時 和repeat循環一樣不需要結束條件, leave語句的意義是 離開循環。

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc6 ()  

     -> begin 

     -> declare v int;  

     -> set v=0;  

     -> LOOP_LABLE:loop  

     -> insert into t values(v);  

     -> set v=v+1;  

     -> if v >=5 then 

     -> leave LOOP_LABLE;  

     -> end if;  

     -> end loop;  

     -> end;  

     -> //  

mysql > DELIMITER ;  

 

 

Ⅳ. LABLES 標號:

標號可以用在begin repeat while 或者loop 語句前,語句標號只能在合法的語句前面使用。可以跳出循環,使運行指令達到復合語句的最后一步。

 

(4). ITERATE迭代

Ⅰ. ITERATE:

通過引用復合語句的標號,來從新開始復合語句

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc10 ()  

     -> begin 

     -> declare v int;  

     -> set v=0;  

     -> LOOP_LABLE:loop  

     -> if v=3 then   

     -> set v=v+1;  

     -> ITERATE LOOP_LABLE;  

     -> end if;  

     -> insert into t values(v);  

     -> set v=v+1;  

     -> if v>=5 then 

     -> leave LOOP_LABLE;  

     -> end if;  

     -> end loop;  

     -> end;  

     -> //  

mysql > DELIMITER ; 

返回結果集示例: 

 


dROP TABLE IF EXISTS test.test;
CREATE TABLE test.test(
id int(10) not null auto_increment,
a int(10) not null,
b int(10) not null,
c int(10) not null,
PRIMARY key (`id`)
)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT '測試表';            //測試的表

 

 

drop PROCEDURE if EXISTS `CREATE_ACCOUNT`;
CREATE PROCEDURE `CREATE_ACCOUNT` (

)
BEGIN
select * from test.test where c=6;

END;

call `CREATE_ACCOUNT`();

 

 調用結果;

下面看java 調用示例:

表與上面相同;


drop PROCEDURE if EXISTS `CREATE_ACCOUNT`;
CREATE PROCEDURE `CREATE_ACCOUNT`(
ACCOUNT CHAR(32),
pwd CHAR(32),
OUT I_RETURN_CODE INT
)
BEGIN



SELECT * FROM test WHERE c = 6 ;
END;

 

 

 

 

package controller;

import java.sql.Connection;
import java.sql.DriverManager;

import com.mysql.jdbc.*;
import java.sql.ResultSet;
import java.sql.Types;

public class CallTest {

public static void main(String[] args) {
Connection conn = null;
java.sql.CallableStatement ps = null;
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root", pass = "123456";
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("regedit driver seccess!");
System.out.println("now,getting a connection .... ...");
conn = DriverManager.getConnection(url, user, pass);
System.out.println("getting connection seccess!");
ps = conn.prepareCall("{call CREATE_ACCOUNT(?,?,?)}");
ps.setString(1,"24ADB4E2F0");
ps.setString(2,"apassword");
ps.registerOutParameter(3, Types.INTEGER); //ret code

 ps.setInt(3, 6); //先注冊在賦值


System.out.println("binding parameters seccess!");
ps.execute();
System.out.println("execute procedure seccess!");
//int ret = ps.getInt(3);
ResultSet rs = ps.getResultSet(); // the result set that procedure return
if(rs != null)
{
while(rs.next())
{ System.out.println(rs.getMetaData().getColumnName(1)+":"+ rs.getInt(1));
System.out.println(rs.getMetaData().getColumnName(2)+":"+ rs.getInt(2));
System.out.println(rs.getMetaData().getColumnName(3)+":"+ rs.getInt(3));

}
}
conn.close();
System.out.println("closing this connection seccess!");
}
catch(Exception e)
{
System.out.println("Exception: "+e);
}
}

}

 


免責聲明!

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



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