你们好,最近小活发现有诸多的小伙伴们对于数据库存储过程面试题,数据库存储过程这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可以由应用程序调用执行,允许用户声明明变量以及进行流程控制。存储过程可以接收参数(输入类型参数、输出类型参数),可以存在多个返回值。所以,存储过程的执行效率高于单一SQL命令的执行效率。
2、1、增强SQL语句的功能和灵活性。
3、2、实现较快的执行速度。客户端第一次调用存储过程时,MySQL引擎会对其进行语法分析、编译等操作,然后将编译结果存储到内存中,所以第一次和之前的效率一样,然而以后会直接调用内存中的编译结果,效率提高。
4、3、减少网络流量。单条SQL语句字符量较大,而通过调用存储过程则只需要传存储过程的名称及相关参数即可,提交给服务器的数据量相对较少。
5、CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name([proc_parameter[,...]]) [characteristic ...] routine_body
6、proc_parameter: [ IN | OUT | INOUT ] param_name type
7、IN表示该参数的值必须在调用存储过程时指定,不能返回。
8、OUT表示该参数的值可以被存储过程改变,并且可以返回。
9、INOUT表示该参数在调用时指定,并且可以被改变和返回。
10、COMMENT 'string'|{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY {DEFINER | INVOKER}
11、COMMENT:注释
12、CONTAINS SQL:包含SQL语句,但不包含读或写数据的语句。
13、NO SQL:不包含SQL语句。
14、READS SQL DATA:包含读数据的语句。
15、MODIFIES SQL DATA:包含写数据的语句。
16、SQL SECURITY {DEFINER | INVOKER}:指明谁有权限来执行。
17、1.过程体由合法的SQL语句构成;
18、2.过程体可以是“任意”SQL语句(这里的任意主要是指对记录的增删改查,多表连接);
19、3.过程体如果为复合结构,则使用BEGIN...END语句;
20、4.复合结构可以包含声明,循环,控制结构。
21、CREATE PROCEDURE sp1() SELECT VERSION();
22、方式一:CALL sp_name([parameter[,...]]) 如果存储过程包含参数,则必须有小括号。
23、方式二:CALL sp_name[()] 如果存储过程不包含参数,则小括号可有可无。
24、ALTER PROCEDURE sp_name [characteristic ...] COMMENT 'string'|{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }
25、只能修改存储过程中的注释、当前内容的类型,并不能修改过程体。要修改过程体的话,需要先删除存储过程,然后重建。
26、DROP PROCEDURE [IF EXISTS] sp_name
27、DELIMITER //
28、CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
29、BEGIN
30、DELETE FROM users WHERE id = p_id;
31、END//
32、DELIMITER;
33、下面来调用存储过程,如下图所示:
34、DELIMITER //
35、CREATE PROCEDURE removeAndReturnUsersNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
36、BEGIN
37、DELETE FROM users WHERE id = p_id;
38、SELECT count(id) FROM users INTO userNums;
39、END
40、//
41、DELIMITER ;
42、1.用户变量:以"@"开始,形式为"@变量名"
43、用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
44、SET @i = 7;
45、2.全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名或者set @@global.变量名
46、对所有客户端生效。只有具有super权限才可以设置全局变量
47、3.会话变量:只对连接的客户端有效
48、4.局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量
49、declare语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量
50、下面来调用存储过程
51、CALL removeAndReturnUsersNums(1,@nums);
52、DELIMITER //
53、CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN p_age SMALLINT UNSIGNED,OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SAMLLINT UNSIGNED)
54、BEGIN
55、DELETE FROM users WHERE age = p_age;
56、SELECT ROW_COUNT() INTO deleteUsers;
57、SELECT COUNT(id) FROM users INTO userCounts;
58、END
59、//
60、DELIMITER ;
61、[注意]ROW_COUNT()函数用来得到插入、删除以及更新的被影响的记录总数。
62、下面来调用存储过程
63、CALL removeUserByAgeAndReturnInfos(20,@a,@b);
64、[注意]@a表示删除的记录数,@b表示剩余的记录数
65、SELECT @a,@b;
66、1.存储过程实现的功能要复杂一些;而函数的针对性更强。
67、2.存储过程可以返回多个值;函数只能有一个返回值。
68、3.存储过程一般独立的来执行;而函数主要作为其他SQL语句的组成部分来出现。
以上就是数据库存储过程这篇文章的一些介绍,希望对大家有所帮助。
标签:
免责声明:本文由用户上传,如有侵权请联系删除!