MySQL存储过程简单记录

1. 基本格式

drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN
  select id;
  select uname into name from t_user where uid = id;
end;

drop ...  create...  类似oracle中的 create or replace ...;

入参和出参格式为:in/out 参数名 参数类型;

在BEGIN .. END中间写过程的具体内容

2. 调用方法

call p_test(1,@name);
select @name;

存储过程的调用方法是: call 过程名(入参值,@出参名);

如果有出参,通过select 可以查看过程的返回值

3. 变量声明与赋值

BEGIN
  declare v_uid int default 1;
  set v_uid = 999;
  select v_uid;
END;

变量声明: declare 变量名  变量类型;

如果有默认值则在类弄后面加上 default 默认值;

变量赋值使用 set 变量名 = 值;

类似打印输出的功能,使用select

4.游标的使用

drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN

  declare v_uid int;
  declare v_uname VARCHAR(100);
  declare v_done int default 0; -- 游标退出标志
  declare cur_t_user cursor for (select uid,uname from t_user); -- 声明游标
  declare continue handler for not found set v_done = 1; -- 声明游标退出时动作

  open cur_t_user; -- 打开游标
  loop_user:loop -- 循环
	  fetch cur_t_user into v_uid,v_uname; -- 遍历
		if v_done = 1 then
			leave loop_user;
		end if;
		select CONCAT(v_uid,'#',v_uname);
	end loop;
  close cur_t_user; -- 关闭游标
END;

游标声明和普通变量一样,declare 游标名 cursor for (游标内容);

在声明完游标后紧接着声明游标查不到内容时的动作,用来退出循环;

使用游标时,open ...close;

这里使用有loop循环的方式,也可以用其它方式,比如while只要能将游标内容遍历即可;

这种loop的方式,loop_user : loop ...  end loop; 其中loop_user是loop的标签,用以区分不同的loop,退出loop时也会用到 leave loop_user;

如果在游标中嵌套游标记得将内层游标写在begin..end内

游标嵌套的例子

drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN

  declare v_uid int;
  declare v_uname VARCHAR(100);
  declare v_done int default 0;
  declare cur_t_user cursor for (select uid,uname from t_user);
  declare continue handler for not found set v_done = 1; 

  open cur_t_user;
    loop_user:loop
    fetch cur_t_user into v_uid,v_uname;
      if v_done = 1 then
        leave loop_user;
      end if;
    select CONCAT(v_uid,'#',v_uname);

      BEGIN
        declare v_done_inner int default 0;
        declare v_ret varchar(200) default '***';
        declare v_uid_inner int;
        declare cur_user_inner cursor for (select uid from t_user);
        declare continue handler for not found set v_done_inner = 1;

        open cur_user_inner;
          loop_user_inner:LOOP
            fetch cur_user_inner into v_uid_inner;
             if v_done_inner = 1 then
							 leave loop_user_inner;
						 end if;
             set v_ret = CONCAT(v_ret,'#',v_uname,'#',v_uid_inner);
          END LOOP;
        close cur_user_inner;
        select v_ret;
      END;
    end loop;
  close cur_t_user;
END;

5. 在命令行中使用大段SQL

mysql> DELIMITER //
drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN
  select id;
  select uname into name from t_user where uid = id;
end;//
DELIMITER;
mysql> 

使用 DELIMITER // .. // DELIMITER ;  作为标记,就可以命令行模式下使用大段SQL 不至于被当做单条SQL执行。

有oracle基础的可以参考下 http://www.cnblogs.com/HondaHsu/p/3641258.html

时间: 2024-10-12 06:13:44

MySQL存储过程简单记录的相关文章

mysql 存储过程简单学习

转载自:http://blog.chinaunix.net/uid-23302288-id-3785111.html ■存储过程Stored Procedure 存储过程就是保存一系列SQL命令的集合,将这些sql命令有组织的形成一个小程序,这样会实现很复杂的处理 SQL基本是一个命令一个命令执行,虽然可以通过连接.子查询等实现些高级的处理,但局限性是显而易见的 ■存储过程的优势 1.提高执行性能(存储过程事先完成了解析.编译的处理,执行时能减轻数据库负担) 2.可减轻网络负担(比起多次传递SQ

MySql存储过程简单实例

转自:http://www.cnblogs.com/zhuawang/p/4185302.html ********************* 创建表 *****************************/ delimiter // DROP TABLE if exists test // CREATE TABLE test( id int(11) NULL ) // /********************** 最简单的一个存储过程 **********************/ dr

mysql存储过程简单使用

1.创建存储过程 BEGIN CREATE TEMPORARY TABLE `tmp_table` ( `name` VARCHAR(100) NOT NULL, `value` VARCHAR(100) NOT NULL ); insert into `tmp_table` select `userName` as `name`,`realName` as `value` from `userinfo` where `isDeleted`=0 limit 10; update `tmp_tab

mysql存储过程相关记录

一个标准的存储过程创建语句 CREATE PROCEDURE myTestPro ( IN text VARCHAR(50), OUT rtv VARCHAR(50) ) BEGIN SET rtv = text; END; 这个存储过程有一个输入参数以及一个输出参数 如此调用 CALL myTestPro ('测试', @rtv); SELECT @rtv; 原文地址:https://www.cnblogs.com/jimaojin/p/8430928.html

MySql 存储过程实例(附完整注释)

将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题! MySql存储过程简单实例:                                                                                                       /********************* 创建表 *****************************/                                            

一点示例明白mysql存储过程

</pre></div><div style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; line-height: 21px;">

mysql 存储过程错误调试记录

 mysql存储过程错误调试记录 公司平台在mysql数据库上运行,一些存储过程报错,调试过程痛苦,记录错误及解决办法,供参考. 调试环境:dbForge Studio for MySQL 6.1版本,试用版: 1.BIZ_GET_ORGAN_BY_CONDITION 问题1:提示递归调用错误,递归次数太多:根据业务设置,最大255: [email protected]@max_sp_recursion_depth = 10; 常见如乱码造成导致条件失效,出现死循环: 问题2:变量的内容是乱

mysql存储过程出参入参,sqlserver很熟悉的一件事到mysql,捣鼓了大半天。记录一下提醒自己。勿看

create PROCEDURE myTestProcname(in score int ,out result varchar(100))BEGINIF score>60 THENset result='yes';ELSEset result='no';END if; END 调用 CALL myTestProcname(50,@result); select @result //为了看下出参结果 附带转来的一点语法 一.创建存储过程1.基本语法:create procedure sp_nam

简单的mysql存储过程

1.我为啥会学mysql存储过程? 因为在之前工作不懂存储过程,没有及时发现bug,后面就花一个月的时间学习mysql存储过程,把公司所有的存储过程及其所有表都弄懂了.然而尴尬的是,在一次面试时面试官要我手写一个存储过程,我既然写不出来. 2.很多东西学会了不经常用就容易忘记,建议大家学会的东西时不时拿出来练练手. 下面就是我写来玩的存储过程 1)创建两张表 CREATE TABLE `mtfan` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMME