Mysql Storage Programs(存储过程)简笔记

1、什么是存储过程

mysql> delimiter ;
mysql> create procedure proc1(out s int) 
   -> begin
   -> select count(*) into s from mysql.user;
   -> end
   -> //
mysql> delimiter ;
mysql> call proc1(@s);
mysql> select @s;

2、创建存储过程

create procedure([[in] |out |inout])

2.1、in values

mysql> delimiter;
mysql> create procedure pin(in p_in int) 
   -> begin
   -> select p_in;
   -> set p_in=2;
   -> select p_in;
   -> end
   -> //
mysql> delimiter ;
mysql> set @p_in=1;
mysql> call pin(@p_in);
mysql> select @p_in;

2.2、out values

example 1:

mysql> delimiter;
mysql> create procedure pout(out p_out int) 
   -> begin
   -> select p_out;
   -> set p_out=2;
   -> select p_out;
   -> end
   -> //
mysql> delimiter ;
mysql> set @p_out=1;
mysql> call pout(@p_out);
mysql> select @p_out

example 2:

mysql> delimiter;
mysql> create procedure pinout(inout p_out int) 
   -> begin
   -> select p_inout;
   -> set p_inout=2;
   -> select p_inout;
   -> end
   -> //
mysql> delimiter ;
mysql> set @p_inout=1;
mysql> select @p_inout
mysql> call pinout(@p_inout);
mysql> select @p_inout

2.3、null values

mysql> delimiter;
mysql> create definer=`root`@`localhost` procedure `test1`(n1 int) 
   -> begin;
   -> set @x=0;
   -> repeat set @[email protected]+1;
   -> insert into world.t3 values (@x);
   -> until @x>n1
   -> end pepeat
   -> end;
   -> //
mysql> delimiter ;
mysql> call test1(10) 
mysql> select @p_inout

2、循环插入语句

mysql> show create tables t3\G;
mysql> delimiter //
mysql> create procedure t3(n1 int)
  -> begin
  -> set @x=0;
  -> repeat set @[email protected]+1;
  -> insert int t3 values (@x);
  -> until @x>n1
  -> end;
  -> //
mysql> delimiter ;
mysql> call t3(10);
mysql> select * from t3;

3、变量定义

declare variable_name [,variable_name...] datatype [default value];

datatype:int,float,date,varchar(length)

decalare l_int int unsigned default 4000000;
decalare l_numeric number(8,2) default 9.95;
decalare l_datetime datetime default ‘1999-12-31 23:59:59‘;
decalare l_varchar varchar(255) default ‘This will not be padded‘;

4、变量赋值

set 变量名 = 表达式值 [,variable_name = expression ...]

mysql> create procedure p1() set @last_procedure =‘p1‘;
mysql> create procedure p2() set selcet coucat(‘Last procedure was‘,@last_procedure);
mysql> call p1();
mysql> call p2();

5、变量的作用域

6、注解

--

/*...*/

7、结构化

7.1、if

mysql > delimiter //
mysql > create procedure proc2(in p1 int)
  --> begin
  --> declare var int;
  --> set var=p1+1;
  --> if var=1 then insert into t values(11);
  --> end if;
  --> if var=2 then insert into t values(22);
  --> else insert into t varlues(33);
  --> end if;
  --> end;
  --> //
mysql >  delimiter ;

7.2、case

mysql > delimiter //
mysql > create procedure proc3(in p1 int)
  --> begin
  --> declare var int;
  --> set var=p1+1;
  --> case var
  --> when 1 then insert into t values(17);
  --> when 2 then insert into t values(18);
  --> else insert into t values(19);
  --> end case;
  --> end;
  --> //
mysql >  delimiter ;

7.3、while

mysql > delimiter //
mysql > create procedure proc4(in p1 int)
  --> 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 ;

7.4、repeat

mysql > delimiter //
mysql > create procedure proc5(in p1 int)
  --> 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 ;

7.5、loop

mysql > delimiter //
mysql > create procedure proc6(in p1 int)
  --> 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 ;

7.6、iterate

mysql > delimiter //
mysql > create procedure proc7()
  --> begin
  --> declare v int default 0;
  --> loop_lable:loop
  --> set v=v+1;
  --> if v<10 then insert loop_lable;
  --> elseif v>20 then leave loop_lable;
  --> else select ‘v is between 10 and 20‘;
  --> end if;
  --> end loop loop_lable;
  --> end;
  --> //
mysql >  delimiter ;

8、查看存储过程状态

mysql >  show procedure status like ‘p%‘\G;
mysql >  select * from information_schema.Routines
  -> where routine_name = ‘p1‘
  -> and
  ->routing_type=‘procedure‘\G;

9、查看存储过程内容

mysql >  show create procedure p2\G;

10、修改存储过程

alter procedure proc_name [characteristic ...]

characteristic:

comment ‘sting‘

| language sql

| {contains sql | no sql | reads sql data | modifies sql data}

| sql security { definer | invoker}

11、删除存储过程

mysql >  drop procedure p2;

12、总结

目前,mysql不支持对已存在的存储过程修改代码,只能先drop掉重写。

存储过程可以调用其他存储过程

存储过程的参数不要与数据表中的字段同名

存储过程的参数可以使用在中文,不顾需要在定义是加上character set gbk,例如:

mysql >  create procedure p1(in u_name varchar(30) character set gbk,out u_score int)
时间: 2024-08-06 02:43:51

Mysql Storage Programs(存储过程)简笔记的相关文章

MySQL视图、存储过程与存储引擎

MySQL视图.存储过程与存储引擎 一.前言 ? 前面的文章已经介绍了MySQL的索引与事务以及MySQL的备份与恢复的相关的内容,本文将对MySQL视图及存储过程以及存储引擎进行讲述. 二.MySQL视图 2.1问题引出--视图的概念 ? 我们在使用SQL语句进行多表查询的时候的命令是非常冗长而麻烦的,如果说这样的操作还非常多的使用的情况下就会加大工作人员的工作量,毕竟不能保证如此长的代码不会写错,并且多次进行如此复杂的查询也会造成服务器资源占用比变大的问题,那么我们有什么好的办法解决这样的问

八、mysql视图、存储过程、函数以及时间调度器

1.create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 2.drop view emp_view 删除视图 ======================================= 1.创建一个存储过程(查询所有数据) create procedure p1 () READS SQL DATA BEGIN select * from t4; END 2.创建一个存储过程(查询传参数据) cre

MySql中创建存储过程

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句.特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗.现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高. 一.MySQL 创建存储过程 "pr_add" 是个简单的

JAVA如何调用mysql写的存储过程

存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `test`.`text_d`(in param1 varchar(10),in param2 varchar(20)) /*LANGUAGE SQL | [NOT] DETERMINISTIC | {

MySQL数据库的存储过程(一)

MySQL数据库的存储过程常规create routinealterexecutesecuritydefiner 在创建存储过程的时候默认是选中相应的数据库(use db_name)所以在编写存储过程时候就不能在存储过程之中编写此语句 delimiter客户端 使用delimiter客户端设置结束符delimiter //主要是为了避免与存储过程中的SQL语句的结束符冲突 创建一个程序或者一个函数create procedure | function 学习存储过程首先我们应该学会最基本的几个操作

MySql基本语法(学习笔记)

MySQL语法大全_自己整理的学习笔记 select * from emp;  #注释 #--------------------------- #----命令行连接MySql--------- #启动mysql服务器 net start mysql #关闭 net stop mysql #进入 mysql -h 主机地址 -u 用户名 -p 用户密码 #退出 exit #--------------------------- #----MySql用户管理--------- #修改密码:首先在D

mysql 5.0存储过程学习总结

mysql存储过程的创建,删除,调用及其他常用命令 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)  mysql 5.0存储过程学习总结 一.创建存储过程 1.基本语法: create procedure sp_name()begin………end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name()注意:存储过程名称后面必

千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记

千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记 2007年3月,我写过一篇文章<解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记>( http://www.xiaohui.com/weekly/20070307.htm ),谈到自己在解决一个拥有 60 万条记录的 MySQL 数据库访问时,导致 MySQL CPU 占用 100% 的经过.在解决问题完成优化(optimize)之后,我发现 Discuz 论坛也存在这个问题,当时稍微提了一下: 发现此主

mysql 中创建存储过程

mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表employee为例写一个简单的sql存储过程: 下边通过创建一个存储过程实现:输入性别,找出与输入性别相匹配的人的平均年龄,并将平均年龄输出. 这里首先通过delimiter &&,将sql语句的结束符换成&&(默认sql语句的结束符是;) 然后如下所示输入: 此时可以把语句的结束