数据库存储过程面试题(数据库存储过程)

导读 你们好,最近小活发现有诸多的小伙伴们对于数据库存储过程面试题,数据库存储过程这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往

你们好,最近小活发现有诸多的小伙伴们对于数据库存储过程面试题,数据库存储过程这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

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语句的组成部分来出现。

以上就是数据库存储过程这篇文章的一些介绍,希望对大家有所帮助。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!