返回参数示例

下面是一个示例:

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`();

MySQL prepare 语句 mysql procedure if_数据库

 

 调用结果;

下面看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); 
 } 
 }}