返回参数示例

下面是一个示例:

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

}

MySql_ procedure的更多相关文章

  1. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  2. SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...

  3. MySQL:procedure, function, cursor,handler

    Procedure & Function Procedure 语法: CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ...

  4. Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?

    在 SQL Server 创建或修改「存储过程(stored procedure)」时,可加上 WITH RECOMPILE 选项,但多数文档或书籍都写得语焉不详,或只解释为「每次执行此存储过程时,都 ...

  5. oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)

    开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~      (当然,你也可以再改简便一点~~~) select db ...

  6. T-Sql(三)存储过程(Procedure)

    今天讲下T-sql语法中存储过程的用法,我们一开始学习数据库语言的时候就是用一些简单的insert,select等语法,但是随着我们学习数据库的深入,就会发现一些简单的语法满足不了我们的要求,比如处理 ...

  7. MySQL 5.7 create VIEW or FUNCTION or PROCEDURE

    1.视图 a. CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY INVOKER VIEW `sakila` ...

  8. csharp: Oracle Stored Procedure DAL using ODP.NET

    paging : http://www.codeproject.com/Articles/44858/Custom-Paging-GridView-in-ASP-NET-Oracle https:// ...

  9. csharp: MySQL Stored Procedure using DAL

    # 建表 塗聚文 20160907 drop table attendrecord; create table attendrecord ( seq INT NOT NULL PRIMARY KEY ...

随机推荐

  1. w3resource_MySQL练习:Basic_select_statement

    w3resource_MySQL练习题:Basic_select_statement 1. Write a query to display the names (first_name, last_n ...

  2. pyecharts用法,本人亲测,陆续更新

    主题 除了默认的白色底色和dark之外,还支持安装扩展包 pip install echarts-themes-pypkg echarts-themes-pypkg 提供了 vintage, maca ...

  3. graph-Kruskal-algorithm

    并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.主要操作:1. 初始化:每个点所在集合初始化为其自身.2. 查找:查找元素所在的集合,即根节点.3. ...

  4. 监控网络流量iftop和nethogs安装

    服务器环境是centos7,centos下通常使用iftop,或者nethogs来进行网络流量监控.这2个工具都需要先安装epel,因为这个库通常操作系统是不自带的.那么就先安装epel,使用的命令是 ...

  5. Educational Codeforces Round 2 Edge coloring of bipartite graph

    题意: 输入一个二分图,用最少的颜色数给它的每条边染色,使得同一个顶点连的边中颜色互不相同. 输出至少需要的颜色数和任意一种染色方案. 分析: 证明不会,只说一下(偷瞄巨巨代码学到的)做法. 假设点的 ...

  6. electron 安装

    1.从网上下载的是nodejs的v0.10.42版本的安装文件,安装node-v0.10.42-x86.msi都使用默认安装,安装完成后会安装在C:\Program Files\nodejs\目录下, ...

  7. LSTM 应用于股票市场

    https://zhuanlan.zhihu.com/p/27112144 1.LSTM对于非平稳数据的预测效果没有平稳数据好 2.神经网络的过拟合:在训练神经网络过程中,“过拟合”是一项尽量要避免的 ...

  8. 用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步

    经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了. 说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些"一本正经的胡扯&quo ...

  9. 设计模式之单例模式 Singleton实现

    饿汉式 饿汉式单例模式,static变量会在类装载时初始化,此时也不会涉及多个线程对象访问该对象的问题.虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题, 因此可以省略synchronized关 ...

  10. [linux小技巧]批量移动文件

    for i in {1..23};do mv test$i/ ../;done