实验八 MySQL的存储过程
- 格式:pdf
- 大小:325.40 KB
- 文档页数:10
mysql存储过程MySQL 5.0 版本开始⽀持存储过程。
存储过程(Stored Procedure)是⼀种在数据库中存储复杂程序,以便外部程序调⽤的⼀种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,⽤户可通过指定存储过程的名字并给定参数(需要时)来调⽤执⾏。
存储过程思想上很简单,就是数据库 SQL 语⾔层⾯的代码封装与重⽤。
优点存储过程可封装,并隐藏复杂的商业逻辑。
存储过程可以回传值,并可以接受参数。
存储过程⽆法使⽤ SELECT 指令来运⾏,因为它是⼦程序,与查看表,数据表或⽤户定义函数不同。
存储过程可以⽤在数据检验,强制实⾏商业逻辑等。
缺点存储过程,往往定制化于特定的数据库上,因为⽀持的编程语⾔不同。
当切换到其他⼚商的数据库系统时,需要重写原有的存储过程。
存储过程的性能调校与撰写,受限于各种数据库系统。
⼀、存储过程的创建和调⽤存储过程就是具有名字的⼀段代码,⽤来完成⼀个特定的功能。
创建的存储过程保存在数据库的数据字典中。
创建存储过程CREATE[DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_bodyproc_parameter:[ IN | OUT | INOUT ] param_name typecharacteristic:COMMENT 'string'| LANGUAGE SQL| [NOT] DETERMINISTIC| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }routine_body: Valid SQL routine statement[begin_label:] BEGIN [statement_list] ……END [end_label]DEFINER:定义者。
实例解析MySQL中的存储过程及存储过程的调⽤⽅法mysql在5.1之后增加了存储过程的功能, 存储过程运⾏在mysql内部,语句都已经编译好了,速度⽐sql更快. 存储过程与mysql相当于shell和linux系统。
如果你是程序员的话,那我告诉你存储过程实际上是⼀个⽅法,你只要调⽤这个⽅法,并且输⼊它设置好的参数就可以获取或者执⾏你想要的操作了. 看了如下存储过程实例,你会发现mysql存储过程和shell很像.下⾯存储过程内容为:调⽤存储过程,并且传⼊⽤户名,密码参数。
存储过程会将这她们存储到process_test表⾥⾯.看实例⼀,创建数据库mysql>create database db_proc;⼆,创建表mysql>CREATE TABLE `proc_test` (`id` tinyint(4) NOT NULL AUTO_INCREMENT, #ID,⾃动增长`username` varchar(20) NOT NULL, #⽤户名`password` varchar(20) NOT NULL, #密码PRIMARY KEY (`id`) #主键) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8; #设置表引擎和字符集三、创建存储过程create procedure mytest(in name varchar(20),in pwd varchar(20))#定义传⼊的参数begininsert into proc_test(username,password) values(name,pwd);#把传进来的参数name和pwd插⼊表中,别忘记分号end; #注意这个分号别忘记了create procedure mytest(in name varchar(20),in pwd varchar(20))#定义传⼊的参数begininsert into proc_test(username,password) values(name,pwd);#把传进来的参数name和pwd插⼊表中,别忘记分号end; #注意这个分号别忘记了四、测试调⽤存储过程⽤法:call 存储过程名称(传⼊的参数)call proc_test("绝⼼是凉⽩开","")username为”绝⼼是凉⽩开“传⼊数据库中,密码”“五、查看数据库中有⽆加⼊的数据select * from proc_test where username=‘绝⼼是凉⽩开';#如果有内容说明成功了六、删除存储过程drop procdure 存储过程名;七、通⽤分页存储过程代码及调⽤DROP PROCEDURE IF EXISTS pr_pager;CREATE PROCEDURE pr_pager(IN p_table_name VARCHAR(1024), /*表名*/IN p_fields VARCHAR(1024), /*查询字段*/IN p_page_size INT, /*每页记录数*/IN p_page_now INT, /*当前页*/IN p_order_string VARCHAR(128), /*排序条件(包含ORDER关键字,可为空)*/IN p_where_string VARCHAR(1024), /*WHERE条件(包含WHERE关键字,可为空)*/OUT p_out_rows INT /*输出记录总数*/)NOT DETERMINISTICSQL SECURITY DEFINERCOMMENT '分页存储过程'BEGIN/*定义变量*/DECLARE m_begin_row INT DEFAULT 0;DECLARE m_limit_string CHAR(64);/*构造语句*/SET m_begin_row = (p_page_now - 1) * p_page_size;SET m_limit_string = CONCAT(' LIMIT ', m_begin_row, ', ', p_page_size);SET @COUNT_STRING = CONCAT('SELECT COUNT(*) INTO @ROWS_TOTAL FROM ', p_table_name, ' ', p_where_string);SET @MAIN_STRING = CONCAT('SELECT ', p_fields, ' FROM ', p_table_name, ' ', p_where_string, ' ', p_order_string, m_limit_string);/*预处理*/PREPARE count_stmt FROM @COUNT_STRING;EXECUTE count_stmt;DEALLOCATE PREPARE count_stmt;SET p_out_rows = @ROWS_TOTAL;PREPARE main_stmt FROM @MAIN_STRING;EXECUTE main_stmt;DEALLOCATE PREPARE main_stmt;END;1.取记录调⽤:call pr_pager('表名', '*', 25, 1, '', '', @count_rows);call pr_pager('user', '*', 15, 2, '', 'where id>3', @count_rows);call pr_pager('user', '*', 15, 1, 'group by password order by id desc', '', @count_rows);2.调⽤1后再取条数调⽤:select @count_rows;select @MAIN_STRING //select sqlselect @COUNT_STRING //seelct count sql⽀持多表级联 ,分组:复制代码代码如下:call pr_pager('job j left join enter_job ej on j.job_no=ej.job_no','j.*,ej.*','25','1','group by ej.put_away_user order byej.put_away_user desc','where j.job_table="enter"',@p_out_rows);<?phpfunction dump_single_form41report($sys_report_id) {$this->dbConn->setFetchMode(DB_FETCHMODE_ASSOC);//SET @a=1;CALL dbpi_report.simpleproc(@a);SELECT @a;$sql = "CALL dbpi_temp.dumpSingleReportForm41($sys_report_id);";$result = $this->dbConn->query($sql);if (mysql_error()) {die (mysql_error().'<b>:</b> dump_single_form41report(...)['.__LINE__.'];<br>'.$sql);}return $result;}function initQueuePool($sys_report_id, $username){$this->dbConn->setFetchMode(DB_FETCHMODE_ASSOC);$this->checkPreviousThread($sys_report_id, $username);$temptablename = "_".$username."_".$sys_report_id;$sql = "SET @a=".$sys_report_id.";";$this->dbConn->query($sql);$sql = "SET @b='".DB_REPORT.".".$temptablename."';";$this->dbConn->query($sql);$sql = "SET @c='".DB_PREPRODUCT."';";$this->dbConn->query($sql);$sql = "CALL ".DB_REPORT.".fm41_simpleproc(@a,@b,@c);";$this->dbConn->query($sql);}普通的查询,只返回⼀个结果集,⽽存储过程却返回⾄少两个结果集,其中⼀个就是存储过程的执⾏状态。
MySQL存储过程详解mysql存储过程详解1. 存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
一个存储过程是一个可编程的函数,它在数据库中创建并保存。
它可以有SQL语句和一些特殊的控制结构组成。
当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。
数据库中的存储过程可以看做是对编程中面向对象方法的模拟。
它允许控制数据的访问方式。
存储过程通常有以下优点:(1).存储过程增强了SQL语言的功能和灵活性。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).存储过程允许标准组件是编程。
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。
而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).存储过程能实现较快的执行速度。
如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。
因为存储过程是预编译的。
在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。
而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).存储过程能过减少网络流量。
针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
(5).存储过程可被作为一种安全机制来充分利用。
系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
MySQL 存储过程1.引⾔存储过程是数据库的⼀个重要对象,可以封装SQL,完成⼀些复杂的业务逻辑。
使⽤存储过程,最主要的特点是执⾏速度快,其经过编译后会⽐⼀条⼀条单独执⾏快,也能避免频繁的连接⽽消耗资源。
2.语法结构2.1创建的语法结构语法结构如下:create[definer = user]procedure procedure_name([proc_parameter[,...]])body[definer = user] ⽤来指定⽤户的执⾏权限,默认所有⽤户可⽤;procedure_name 指定存储过程的名字;proc_parameter 指定存储过程的参数,类型有 in(⼊参)、out(出参)、inout(同时作为⼊参和出参);body 中写程序体,只要是合法的sql即可。
⼀般会以begin开始,以end结束,必须成对出现,通常⼀对即可。
在调⽤时,根据⼊参和出参,使⽤call 关键字和存储过程名调⽤即可。
2.2删除的语法结构drop procedure procedure_name删除时指定存储过程名称即可,不能加括号。
2.3⽰例演⽰1)创建存储过程create procedure proc_test()beginselect now() from dual;end;2)调⽤存储过程call proc_test();上述的存储过程仅是⽤来查询时间的,故执⾏结果是当前时间。
3)删除存储过程drop procedure proc_test;3.变量及赋值3.1局部变量是⽤户⾃定义的变量,尽在begin/end 块中有效。
1)语法declare var_name type [default var_value];使⽤declare 关键字声明变量名和类型,可指定默认值。
2)使⽤set赋值给变量赋值,可以使⽤set和into关键字,对所有变量都适⽤。
create procedure proc_var01()begindeclare user_name varchar(50);#直接声明,⽆默认值declare age int(11) default20;#声明的同时指定默认值set user_name = '张三';#赋值select user_name,age; #查询end;若有多个set对其赋值,则最终值是最后⼀个set 的结果。
mysql 存储过程定义注释摘要:1.MySQL存储过程简介2.MySQL存储过程的定义3.MySQL存储过程的注释4.总结正文:MySQL存储过程是一种将SQL语句和程序逻辑组合起来的功能强大的工具。
它允许用户在数据库中执行一系列预编译的SQL语句,从而提高了查询性能。
存储过程可以处理复杂的业务逻辑,简化应用程序的开发,同时也可以提高数据的安全性。
MySQL存储过程的定义包括以下几个部分:- 存储过程名称:用于标识存储过程的名称,应遵循命名规范,例如:`create_table`。
- 参数列表:用于传递数据给存储过程的变量,可以定义输入参数、输出参数和输入输出参数。
例如:`create_table(IN param1 INT, OUT param2 VARCHAR)`。
- 功能描述:存储过程的具体功能,例如:`创建一个表`。
- SQL语句:存储过程执行的SQL语句,例如:`CREATE TABLEnew_table (id INT PRIMARY KEY, name VARCHAR(255))`。
在MySQL存储过程中,可以使用注释来对代码进行说明。
注释对于理解和维护存储过程非常有帮助。
在MySQL中,可以使用`--`来编写单行注释,使用`/* */`来编写多行注释。
例如:```sqlDELIMITER //CREATE PROCEDURE create_table(IN param1 INT, OUT param2 VARCHAR)-- 功能描述:创建一个表BEGIN-- 定义变量DECLARE var1 INT;DECLARE var2 VARCHAR(255);-- 给变量赋值SET var1 = param1;SET var2 = "new_table";-- 执行SQL语句CREATE TABLE var2 (id INT PRIMARY KEY,name VARCHAR(255));-- 输出结果SELECT "表已创建";END//DELIMITER ;```总之,MySQL存储过程是一种非常有用的工具,可以帮助用户简化应用程序的开发,提高数据的安全性和查询性能。
MySQL存储过程实例详解```CREATE PROCEDURE procedure_name ([IN , OUT , INOUT] parameter datatype)[MODIFIESSQLDATA]BEGIN--声明和执行多个SQL语句END;```其中,procedure_name是存储过程的名称,datatype是参数的数据类型。
参数可以是IN参数(只能输入)、OUT参数(只能输出)或INOUT 参数(可读写输入和输出)。
MODIFIES SQL DATA子句用于指定存储过程是否会改变数据库中的数据。
下面是一个简单的MySQL存储过程示例,该存储过程接受一个IN参数,并在employees表中插入一条新记录:```sqlCREATE PROCEDURE add_employee(IN name VARCHAR(50))BEGININSERT INTO employees (name) VALUES (name);SELECT 'Employee added successfully' AS message;END;```在这个示例中,我们创建了一个名为`add_employee`的存储过程,并使用`IN`参数`name`作为输入。
存储过程将传递的参数插入到`employees`表中,并返回一条消息。
我们可以像调用函数一样调用存储过程:```sqlCALL add_employee('John Doe');```这将执行存储过程,并将`'John Doe'`作为参数传递给存储过程。
存储过程还可以具有多个参数,并且可以使用控制结构(如IF语句和循环)来实现更复杂的逻辑。
例如,下面是一个存储过程示例,将工资增加的百分比作为IN参数,并将增加的过程应用于`employees`表的所有记录:```sqlCREATE PROCEDURE increase_salary(IN percentage DECIMAL(5,2)) BEGINDECLARE done INT DEFAULT FALSE;DECLARE emp_name VARCHAR(50);--声明一个游标来获取员工名称DECLARE cur CURSOR FOR SELECT name FROM employees;--声明异常处理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;--打开游标OPEN cur;--循环遍历所有记录read_loop: LOOP--获取下一个记录FETCH cur INTO emp_name;IF done THENLEAVE read_loop;ENDIF;--更新工资UPDATE employees SET salary = salary * (1 + percentage) WHERE name = emp_name;ENDLOOP;--关闭游标CLOSE cur;SELECT 'Salaries have been increased successfully' AS message;END;```以上示例中,我们创建了一个名为`increase_salary`的存储过程,并在参数列表中定义了一个`percentage`参数,它表示工资将增加的百分比。
MySQL中的存储过程和函数MySQL是一种常用的关系型数据库管理系统,被广泛应用于各种企业级应用和网站。
在MySQL中,存储过程和函数是两个非常重要的概念,它们提供了一种机制,允许开发者在数据库层面上实现复杂的业务逻辑。
在本文中,我们将深入探讨MySQL中的存储过程和函数,了解它们的定义、使用方法、优点和注意事项等。
一、存储过程存储过程是一段预编译的SQL代码,可被存储在数据库中并供以后使用。
它可以接受参数、执行多个SQL语句,并返回结果。
存储过程在数据库中具有独立性和复用性,可以被多个应用程序共享,提高了数据处理的效率和安全性。
1. 定义存储过程在MySQL中,可以使用CREATE PROCEDURE语句来定义一个存储过程。
例如,我们可以创建一个简单的存储过程来查询员工表中的数据:```mysqlDELIMITER //CREATE PROCEDURE GetEmployee()BEGINSELECT * FROM employee;END //DELIMITER ;```上述代码首先使用DELIMITER语句将结束符设置为双斜杠(//),然后使用CREATE PROCEDURE语句定义了名为GetEmployee的存储过程,通过SELECT语句查询了employee表中的所有数据。
最后,使用DELIMITER语句将结束符重新设置为分号(;)。
2. 调用存储过程在MySQL中,可以使用CALL语句来调用存储过程。
例如,我们可以调用上面定义的GetEmployee存储过程来查询员工表中的数据:```mysqlCALL GetEmployee();```通过CALL语句调用存储过程,并在后面加上括号即可。
3. 存储过程的参数和返回值存储过程可以接受参数,并且可以有返回值。
参数可以是输入参数和输出参数。
输入参数用于传递数据给存储过程,而输出参数用于返回数据给调用者。
在MySQL中,可以使用IN关键字定义输入参数,使用OUT或INOUT关键字定义输出参数。
如何使用MySQL存储过程随着数据量的不断增长以及复杂的业务逻辑需求,使用存储过程成为了数据库开发中的一个重要工具。
MySQL作为一种常用的关系型数据库,也提供了存储过程的支持。
本文将从存储过程的概念、创建和调用等方面展开,探讨如何使用MySQL存储过程优化数据库开发。
一、存储过程概述存储过程是一组预编译的SQL语句的集合,类似于函数,可以接受输入参数、执行查询以及返回结果等操作。
相比于单独执行SQL语句,存储过程可以提高数据库性能,减少网络流量,并简化复杂的SQL操作。
二、创建存储过程MySQL中创建存储过程需要使用CREATE PROCEDURE语句。
下面以一个简单的示例来说明如何创建存储过程。
```DELIMITER //CREATE PROCEDURE GetOrderCountByCustomer(IN customerName VARCHAR(50), OUT orderCount INT)BEGINSELECT COUNT(*) INTO orderCount FROM orders WHERE customer_name = customerName;END //DELIMITER ;```上述示例的存储过程名为GetOrderCountByCustomer,接受一个输入参数customerName和一个输出参数orderCount。
该存储过程根据输入的customerName统计订单数量,并将结果保存到orderCount中。
在创建存储过程时,需要注意以下几点:1. 使用DELIMITER语句设置分隔符。
由于存储过程中可能包含多个SQL语句,为了区分每个语句的结束,需要先设置分隔符。
示例中使用//作为分隔符。
2. 创建存储过程的语法为CREATE PROCEDURE。
在示例中,创建存储过程的语句为CREATE PROCEDURE GetOrderCountByCustomer。
mysql存储过程原理
MySQL存储过程是一系列SQL语句的集合,被封装成一个单独的数据库对象,并在数据库服务器上进行编译和执行。
下面是MySQL存储过程的一般原理:
1. 创建存储过程:首先,在MySQL中使用CREATE PROCEDURE语句创建存储过程,并指定存储过程的名称以及参数(如果有)。
存储过程可以包含一组SQL 语句、流程控制语句和变量定义等。
2. 存储过程编译:当存储过程被创建后,MySQL服务端会对其进行编译。
编译过程中会校验语法的正确性、检查参数和变量的定义、分析SQL语句的执行计划等。
3. 存储过程存储:完成编译后,MySQL将存储过程的定义和相关信息存储在系统表中,例如mysql.proc表。
这些信息包括存储过程的名称、参数、代码、访问权限等。
4. 存储过程执行:当需要执行存储过程时,客户端通过CALL语句调用存储过程,并传递必要的参数。
MySQL服务端接收到请求后,会根据存储过程的定义执行其中的SQL语句。
5. 存储过程优化:MySQL对存储过程也会进行优化处理,类似于对普通的SQL查询进行优化。
这包括解析和重写SQL语句、选择合适的索引和执行计划、缓存结果等。
6. 存储过程事务控制:存储过程可以包含事务控制语句,如BEGIN、COMMIT 和ROLLBACK等,用于确保一组操作的原子性和一致性。
总结起来,MySQL存储过程的原理是通过存储过程对象,将一系列SQL语句封装在数据库中,并由MySQL服务端进行编译和执行。
它具有更好的安全性、可重用性和性能优化的特点,适用于实现复杂的业务逻辑和数据处理操作。