数据库存储过程面试题及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

数据库存储过程面试题及答案

一、基础概念题

什么是存储过程?相比直接写SQL语句,它有哪些优势?

答:存储过程是数据库中预编译好的一组SQL语句集合,可像函数一样被调用。优势有3点:

复用性:一次创建多次调用,避免重复写SQL;

性能好:预编译后存储在数据库,调用时无需重新解析SQL(MySQL8.0后默认缓存执行计划);

安全性:可通过权限控制让用户调用存储过程,但不直接访问表,避免误操作或数据泄露。

存储过程和函数(UDF)有什么核心区别?

答:最关键的3个区别:

返回值:函数必须有且只有1个返回值(可用于SELECT语句中,如SELECTfunc(id));存储过程可无返回值,或通过OUT/INOUT参数返回多个值;

用途:函数侧重计算并返回结果(如计算订单金额);存储过程侧重执行批量操作(如批量更新用户状态);

权限:函数默认不能执行DML(INSERT/UPDATE/DELETE),存储过程无此限制。

二、实操应用题

请写一个MySQL存储过程,实现“根据用户ID查询用户姓名和手机号”,要求支持输入用户ID,输出姓名和手机号。

答:代码示例(含参数定义和异常处理):

DELIMITER//--临时修改语句结束符,避免与存储过程内分号冲突

CREATEPROCEDUREGetUserInfo(

INin_user_idINT,--输入参数:用户ID

OUTout_usernameVARCHAR(50),--输出参数:姓名

OUTout_phoneVARCHAR(20)--输出参数:手机号

)

BEGIN

--异常处理:若查询无结果,设置输出为NULL

DECLAREEXITHANDLERFORNOTFOUND

BEGIN

SETout_username=NULL;

SETout_phone=NULL;

END;

--核心查询逻辑

SELECTusername,phone

INTOout_username,out_phone

FROMusers

WHEREuser_id=in_user_id;

END//

DELIMITER;

--调用方式

CALLGetUserInfo(1001,@uname,@phone);

SELECT@unameASusername,@phoneASphone;

如何在存储过程中处理异常?比如“批量插入订单时,若某条数据主键冲突,跳过该条继续插入其他数据”。

答:用DECLAREHANDLER捕获异常,结合循环实现“跳过错误”。示例(MySQL):

DELIMITER//

CREATEPROCEDUREBatchInsertOrders(

INorder_dataJSON--输入参数:JSON格式的订单列表,如[{order_id:1,user_id:101},{order_id:2,user_id:102}]

)

BEGIN

DECLAREiINTDEFAULT0;

DECLAREtotalINTDEFAULTJSON_LENGTH(order_data);

DECLAREcurr_orderJSON;

DECLAREcurr_order_idINT;

DECLAREcurr_user_idINT;

--捕获主键冲突异常,仅打印提示不中断流程

DECLARECONTINUEHANDLERFOR1062--1062是MySQL主键冲突错误码

BEGIN

SELECTCONCAT(订单ID,curr_order_id,已存在,跳过插入)ASmsg;

END;

--循环遍历JSON数据

WHILEitotalDO

SETcurr_order=JSON_EXTRACT(order_data,CONCAT($[,i,]));

SETcurr_order_id=JSON_UNQUOTE(JSON_EXTRACT(curr_order,$.order_id));

SETcurr_user_id=JSON_UNQUOTE(JSON_EXTRACT(curr_order,$.user_id));

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档