存储过程面试常见问题(面试题之存储过程)
2023-10-10 11:22:00
来源 : haohaofanwen.com
投稿人 : admin
下面是好好范文网小编收集整理的存储过程面试常见问题(面试题之存储过程),仅供参考,欢迎大家阅读!
一、什么是存储过程
简单来说,存储过程就是一组预先编译好的sql语句集。
二、创建语法
create procedure 存储过程名(参数列表)begin//....存储过程体end;
参数列表主要有三种形式:
IN : 需要调用者传入
OUT : 作为返回值
INOUT : 调用者传入参数,对应的可以有返回值
注意点:
由于sql语句默认以";"分号作为分隔符,因此存储过程体中每一条sql语句结尾都必须加上分号;
存储过程结尾需要使用delimiter 标记重新去设置存储过程的结束标记;
三、优点
提高重用性,减少冗余;
减少了sql的编译次数,减少了与服务器连接交互的次数;
四、案例
首先我们先创建两种表emp和dept表,sql脚本如下:
-- ------------------------------ Table structure for dept-- ----------------------------DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` ( `dept_id` varchar(255) NOT NULL, `dept_name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of dept-- ----------------------------INSERT INTO `dept` VALUES ('1', '开发部');INSERT INTO `dept` VALUES ('2', '技术部');INSERT INTO `dept` VALUES ('3', '测试部');DROP TABLE IF EXISTS `emp`;CREATE TABLE `emp` ( `emp_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '员工ID', `emp_name` varchar(255) DEFAULT NULL, `dept_id` varchar(255) DEFAULT NULL, PRIMARY KEY (`emp_id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ------------------------------ Records of emp-- ----------------------------INSERT INTO `emp` VALUES ('1', '张三', '1');INSERT INTO `emp` VALUES ('2', '李四', '2');INSERT INTO `emp` VALUES ('3', '王五', '3');
【a】空参数列表
DELIMITER $$CREATE PROCEDURE allEmpList()BEGIN SELECT * from emp;END $$
存储过程调用:
call allEmpList()
运行结果:
【b】带IN 模式的存储过程
DELIMITER $$CREATE PROCEDURE getEmpByEmpName (IN empName VARCHAR(255))BEGIN SELECT * FROM emp t LEFT JOIN dept t2 ON t.dept_id = t2.dept_id WHERE t.emp_name = empName ; END$$
存储过程调用:
call getEmpByEmpName('张三')
运行结果:
【c】带out的存储过程
DELIMITER $$CREATE PROCEDURE getEmpNameByEmpId ( IN empId INT, OUT empName VARCHAR (255))BEGIN SELECT t.emp_name INTO empName FROM emp t WHERE t.emp_id = empId ; END$$
存储过程调用:
call getEmpNameByEmpId(1,@empName);select @empName as empName;
运行结果:
【d】带INOUT的存储过程
DELIMITER $$CREATE PROCEDURE customSum (INOUT a INT, INOUT b INT)BEGINSET a = a * 12 ;SET b = b * 12 ; END$$
存储过程调用:
set @a = 10;set @b = 11;call customSum(@a,@b);select @a,@b;
运行结果: