mysql-存储过程
测试表数据
CREATE TABLE `dept` (
`code` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`parent_code` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105', '总公司', NULL);
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105001', '一分公司', 'C105');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105002', '二分公司', 'C105');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105003', '三分公司', 'C105');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105001001', '规划处', 'C105001');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105001002', '信息部', 'C105001');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105001002020', '技术中心', 'C105001002');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105002090', '塔里木', 'C105002');
INSERT INTO `wh_test`.`dept`(`code`, `name`, `parent_code`) VALUES ('C105003008', '长庆处', 'C105003');
1.创建存储过程
-
selectcompanyByNmae : 存储过程名字
-
( IN cname VARCHAR ( 20 ) ): 括号内定义需要传的参数,创建形惨需要:——> in/out/inot-参数模式 ,形参名字,数据类型
-
要执行的内容需要写在 BEGIN END字符之间,如果只有一句可以省略不写,可以看作是java方法那个大括号{ }
存储过程语法
CREATE PROCEDURE selectcompanyByNmae ( IN cname VARCHAR ( 20 ) ) BEGIN
SELECT
*
FROM
dept
WHERE
NAME = cname;
END
参数模式:in,out,inout
- in 需要调用方输入的参数,例:call addStudentNo(‘123456’);创建存储过程时,模式要写成in,调用的时候就需要传入一个值
- out 返回是一个变量,需要用一个变量来接收,例:call selectStudentNo(@studentNo);函数不需要传入值,但是需要变量@studentNo接收
- 传入两个带有值的变量,经过存储过程操作后返回这两个变量
out参数模式
- 形参与字段名一样,通过表名区分 - dept.code 、dept.name
- 将查询结果赋值给变量 通过select xxxa,xxxb into xxxa变量,xxxb变量
CREATE PROCEDURE selectcompanyByNmae1 (
IN cname VARCHAR ( 20 ),
out `code` varchar(20)
) BEGIN
SELECT
dept.CODE into `code`
FROM
dept
WHERE
NAME = cname;
END
inout模式
创建
CREATE PROCEDURE computedResult(
inout a int,
inout b int
)
BEGIN
set a= a*10;
set b= b*10;
END
调用
set @aa:=1;
set @bb:=3;
call computedResult(@aa,@bb);
SELECT @aa,@bb
返回结果
2.调用存储过程
call 存储过程的名字()
- 存储过程的本质就是一段sql代码,本质内容是看你begin 和 end的之前的代码段是做什么的。
- 以前不了解的时候,总以为使用存储过程会返回一段处理结果,就和使用select一样,然而这个返回没有关系,主要看代码段内容
- 代码里写的是select查询字段(不是 select xxx into xxx),才会有结果查看