存储过程面试题及参考答案.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语句直接执行相比,核心优势是什么?

存储过程中的“参数”有哪几种类型?分别说明用法和场景(举例说明)。

存储过程和函数(Function)的核心区别是什么?实际开发中如何选择使用?

参考答案:

通俗理解:存储过程是预存在数据库里的一段“SQL脚本集合”,可以包含查询、插入、更新、循环、判断等逻辑,提前编译好,调用时直接执行。核心优势:①效率高(预编译,减少网络传输和编译耗时);②复用性强(一次编写,多处调用,减少重复代码);③安全性好(可控制权限,隐藏核心逻辑,避免SQL注入);④简化复杂操作(将多步SQL封装,降低业务侧复杂度)。

三种参数类型:

IN:输入参数(默认类型),用于向存储过程传递值,存储过程内不可修改。场景:查询条件传递,比如“根据用户ID查询订单”的ID参数。

OUT:输出参数,用于存储过程向外部返回值,参数本身初始无值,过程内赋值后外部可用。场景:返回统计结果,比如“统计某用户订单数”,将结果通过OUT参数返回。

INOUT:既输入又输出,传入初始值,过程内可修改并返回新值。场景:累加计算,比如“传入初始值10,过程内加5后返回15”。

核心区别:①返回值:函数必须有返回值(且只能一个),存储过程可通过OUT/INOUT返回多个值,也可无返回值;②调用方式:函数可嵌入SQL语句中调用(比如SELECTfunc()),存储过程需用CALL语句单独调用;③用途:函数侧重“计算并返回结果”(比如数据格式化、数值计算),存储过程侧重“执行一系列业务操作”(比如订单创建、数据同步)。选择原则:需要嵌入SQL查询中使用、仅需单个返回值→用函数;需要多步操作、多返回值或无返回值→用存储过程。

二、实操编写题(考察语法落地)

假设有员工表emp(emp_idINT主键,emp_nameVARCHAR(50),dept_idINT,salaryDECIMAL(10,2)),请编写一个存储过程:

输入参数:部门ID(dept_id_in)、薪资涨幅比例(rate_in,如0.1代表10%)

功能:给该部门所有员工涨薪(salary=salary*(1+rate_in))

输出参数:成功涨薪的员工人数(count_out)

要求:如果部门ID不存在,输出0,不执行涨薪操作。

基于上述emp表,编写一个存储过程:

输入参数:薪资下限(sal_min)、薪资上限(sal_max)

功能:查询薪资在[sal_min,sal_max]之间的员工信息,要求分页返回

额外参数:页码(page_num)、每页条数(page_size)

输出参数:总符合条件的员工数(total_count)

参考答案:

涨薪存储过程(MySQL语法):

DELIMITER//

CREATEPROCEDUREproc_update_salary(

INdept_id_inINT,

INrate_inDECIMAL(5,2),

OUTcount_outINT

)

BEGIN

--初始化输出参数

SETcount_out=0;

--先判断部门是否存在员工

IFEXISTS(SELECT1FROMempWHEREdept_id=dept_id_in)THEN

--执行涨薪

UPDATEemp

SETsalary=salary*(1+rate_in)

WHEREdept_id=dept_id_in;

--获取受影响行数(即成功涨薪人数)

SETcount_out=ROW_COUNT();

ENDIF;

END//

DELIMITER;

--调用示例

SET@count=0;

CALLproc_update_salary(3,0.1,@count);

SELECT@countAS成功涨薪人数;

分页查询存储过程(MySQL语法):

DELIMITER//

CREATEPROCEDUREproc_query_emp_by_sal(

INsal_minDECIMAL(10,2),

INsal_maxDECIMAL(10,2),

INpage_numINT,

INpage_sizeINT,

OUTtotal_c

文档评论(0)

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

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

1亿VIP精品文档

相关文档