`
conkeyn
  • 浏览: 1529132 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

MySQL 存储过程的使用

阅读更多

 

drop procedure if exists test.get_title;
delimiter $$
create procedure test.get_title(in id int)
BEGIN
	select title,subtitle,pubname from titles,publishers
	where titleID=id and titles.pubID=publishers.pubID;
end$$

call test.get_title(1);

drop procedure if exists test.half;
delimiter $$
create procedure test.half(in a int , out b DOUBLE)
BEGIN
	set b = a/2;
end $$
call test.half(15,@result);
select @result;

 

2、变量

  •    全局性的普通SQL变量。这类变量的名字前面都有一个“@”字符作为前缀。这些变量在SP里的用法与它们在普通SQL命令里的用法一样。它们的内容将一直保存到与MySQL服务器断开链接为止。
  • SP内部使用的局部变量和参数。这些变量的名称前面没有“@”字符。必须在使用它们之前用declare命令对它们做出声明。局部变量的内容在过程或函数退出执行时即告丢失。局部变量只在对它们做出声明的那个begin-end语句块里有效。这意味着可以在同一个过程里声明多个同名的局部变量——只要它们不在同一个begin-end语句块里就行。
  • 声明变量(declare)。变量的声明必须发生在begin-end语句块里,而且必须发生同一个begin-end语句块里的其他命令之前。
    declare varname1,varname2,... datatype [default value];

示例代码:

drop procedure if exists test.test;
create procedure test.test()
BEGIN
	declare x int default 0;
	BEGIN
		DECLARE x int DEFAULT 1;
		if true then 
			BEGIN
				DECLARE x int DEFAULT 2;
				select x ;
			END;
		end if;
		SELECT x as `outer`;
	END;
	select x as outest;
END;

call test.test();

  3、对变量赋值 。SQL语言不允许以x=x+1的形式对变量进行赋值,必须使用SET或SELECT INTO命令做这件事。后者都是SELECT命令的一程变体,它以INTO varname 结果整条命令。这种语法变量要求SELECT命令返回且只能返回一条数据记录(不请允许是多条记录)。请注意,在函数里只能使用SET命令对变量赋值,这是因为函数里不允许使用SELECT或其他SQL命令。

# 在普通环境中使用变量例子
set @var1 = value1, @var2 = value2;
select @var1:=value2;
select 2 * 7 into var1;
select @total:=count(*) from table where id =1 into @total;
select @total:=count(*) from table where id =1 ;
select title,subtitle from table1 where id =1 into @var_title,@var_subtitle;
SELECT id, data INTO x, y FROM test.t1 LIMIT 1;
 
# 在存储过程中使用变量例子。
drop procedure if exists test.total;
create procedure test.total()
BEGIN
	declare x int default 0;
	select count(*) from name1 into x;
  select x;
END;
call total();

4、出错处理(出错处理句柄)

      SP里的SQL命令在执行过程中可能会出错,所以SQL也像其他一些程序设计语言那样向程序员提供了一种利用出错处理句柄(error handler,也有称为“出错处理器”)来响应和处理这类错误的机制。

      在一个Begin-end语句块里对出错处理句柄的定义必须出现在变量、光标、出错条件的声明之后、其他SQL命令之前;具体语法如下所示:

 
declare type handler for condition1, condition2, condition3;

 下面对这个语法中的type、condition和command进行解释。

 

增加分类记录的存储过程:

 表结构的SQL:

CREATE TABLE `categories` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(100) default NULL,
  `parent_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`id`)
) ;
 
drop procedure if exists test.test_insert;
create procedure test.test_insert(in newcatname varchar(100), in parent int, out newid int)
proc:BEGIN
	declare cnt int;
	set newid = -1;
	-- validation
	select count(*) from test.categories where parent_id = parent into cnt;
	if ISNULL(newcatname) or TRIM(newcatname) ="" then 
		leave proc; 
	end if;
	select count(*) from test.categories WHERE parent_id = parent and `name` = newcatname into cnt;
	if cnt =1 then 
		select id from  test.categories WHERE parent_id = parent and `name` = newcatname into newid; 
		leave proc;
	end if;
	insert into test.categories (`name`,parent_id)values(newcatname,parent);
	set newid = LAST_INSERT_ID();
end proc;
-- 调用不能与创建语句同时执行?
call test.test_insert("category name 2",0,@newid);
select @newid;
 

分享到:
评论

相关推荐

    MySQL存储过程的异常处理方法

    本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...

    mysql存储过程教程

    调用存储过程使用`CALL`关键字,将参数值传递给对应的参数名。继续以上例,调用存储过程的方式如下: ```sql CALL addNumbers(3, 5, @sum); SELECT @sum; -- 输出结果为 8 ``` 四、存储过程中的控制结构 1. 条件...

    mysql经典教程+mysql存储过程讲解

    本教程结合"mysql经典教程+mysql存储过程讲解"的主题,将深入探讨MySQL的基础知识以及核心特性——存储过程。 首先,我们需要理解什么是数据库。数据库是一个组织和存储数据的系统,允许用户以结构化方式访问和管理...

    mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...

    Mysql存储过程常用语句模板

    Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...

    c++实现调mysql存储过程

    c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等

    MySQL存储过程编程.pdf

    MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的编程技术。存储过程是一种可以在数据库中存储和执行的程序单元,它可以实现复杂的业务逻辑和数据处理操作。 在 MySQL 5.0 中,存储过程的...

    Java实现调用MySQL存储过程详解

    注意,如果你的存储过程使用了用户定义的变量或会改变当前会话的状态,可能需要使用`DEFINER`或`Invoker Rights`来控制执行权限。在上述的`show procedure status`查询中,`Security_type`列显示为`DEFINER`,这意味...

    MySQL存储过程学习

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列的SQL语句,形成一个可重复使用的代码块,以提高数据处理的效率和应用程序的性能。在这个"MySQL存储过程学习"的主题中,我们将深入探讨...

    MySQL 存储过程入门到精通

    MySQL存储过程是数据库管理系统中的一个重要特性,它允许程序员或数据库管理员预先定义一组SQL语句,形成一个可重用的逻辑单元。在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用...

    mysql中文手册+mysql命令大全+mysql存储过程

    最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...

    mysql存储过程调试工具

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者编写一系列复杂的SQL语句,并作为一个单元进行执行,提高代码复用性和效率。然而,与普通的编程语言一样,存储过程的调试同样至关重要,因为错误的存储...

    MySQL存储过程完整版使用代码示例

    资源包中囊括了MySQL数据库中的存储过程的...该资源下所有内容都是本人的日常软件开发经验总结,对于初学者使用MySQL存储过程的程序员具有重要参考价值,问大家要10分是不过分的,用过就知道了,欢迎大家下载参考及使用

    MySQL存储过程.rar

    总的来说,掌握MySQL存储过程的使用是提升数据库管理和开发能力的关键步骤,能够有效优化数据库性能,简化复杂的操作,并提高代码的可维护性。通过阅读"MySQL存储过程.pdf"这份教程,你将能深入理解存储过程的原理,...

    mysql存储过程实现分页

    根据题目提供的信息,下面将详细介绍如何使用MySQL存储过程实现分页功能: ```sql CREATE PROCEDURE paging( IN name VARCHAR(1024), // 表名 IN fields VARCHAR(1024), // 查询字段 IN size INT, // 每页显示的...

    mysql存储过程实例

    MySQL 存储过程实例 MySQL 存储过程实例详细介绍了 MySQL 存储过程的开发步骤,本节将通过具体的实例讲解 PHP 是如何操纵 MySQL 存储过程的。 创建存储过程 存储过程的创建是 MySQL 存储过程的基础,MySQL 5.0 ...

    MySQL存储过程.pdf

    MySQL存储过程 MySQL存储过程(Stored Procedure)是一种复杂的数据库对象,允许用户将多个SQL语句组合成一个单一的执行单元,以提高数据库的性能和可维护性。下面是 MySQL 存储过程的相关知识点: 存储过程的定义...

Global site tag (gtag.js) - Google Analytics