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);
}
}

}

原文地址:https://www.cnblogs.com/anyehome/p/7979092.html