mysql中存储过程的简单使用

-- ----------------------------
-- 一个subject表
-- ----------------------------
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `subjectName` varchar(100) NOT NULL,
  `chapterCount` int(10) NOT NULL,
  `semester` varchar(50) NOT NULL,
  `editionId` int(10) NOT NULL,
  `seq` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `PK_subject` (`id`),
  KEY `FK_subject_Edition` (`editionId`),
  CONSTRAINT `subject_ibfk_1` FOREIGN KEY (`editionId`) REFERENCES `edition` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- ----------------------------
-- subject表中数据
-- ----------------------------
INSERT INTO `subject` VALUES ('1', '软件技术基础', '6', 'S1', '1', null);
INSERT INTO `subject` VALUES ('2', 'J2SE', '14', 'S1', '1', null);
INSERT INTO `subject` VALUES ('3', 'SQL Server数据库开发', '5', 'S1', '1', null);
INSERT INTO `subject` VALUES ('4', '静态网页开发技术', '6', 'S1', '1', null);
INSERT INTO `subject` VALUES ('5', 'Oracle大型数据库开发技术', '10', 'S2', '1', null);
INSERT INTO `subject` VALUES ('6', 'XML可扩展标记语言', '4', 'S2', '1', null);
INSERT INTO `subject` VALUES ('7', 'JavaScript与JQuery', '10', 'S2', '1', null);
INSERT INTO `subject` VALUES ('8', '深入Java Web技术', '14', 'S2', '1', null);
INSERT INTO `subject` VALUES ('9', 'Android手机应用程序开发', '0', 'S2', '1', null);
INSERT INTO `subject` VALUES ('10', '设计模式', '0', 'S2', '1', null);
INSERT INTO `subject` VALUES ('11', 'Struts2框架技术', '9', 'S3', '1', null);
INSERT INTO `subject` VALUES ('12', 'Hibernate框架技术', '6', 'S3', '1', null);
INSERT INTO `subject` VALUES ('13', 'Spring框架技术', '5', 'S3', '1', null);
INSERT INTO `subject` VALUES ('14', '软件测试技术1', '0', 'S3', '1', null);
INSERT INTO `subject` VALUES ('15', 'SCJP及面试', '0', 'S3', '1', null);

以该subject表为例,接下来的存储过程都是对该表的数据进行操作;

一个无参的存储过程:

delimiter // --将mysql的结束语句符号变成‘//’
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`()
BEGIN 
	select * from subject;
END // -该存储过程在这里结束
delimiter; --将mysql的结束语句符号还原成之前的“;”

1.mysql存储过程中在创建中可以指定安全属性,其中definer就是一种安全属性,其默认值为当前的用户,然后在该存储过程被调用时会对该用户进行权限判断,同时definer属性一般是默认的,即不需要手动编写;

2.在无参存储过程创建中一定要记得在过程名后加一个括号,不论有没有参数,该括号都不能省;

3.delimiter 如果是多个存储过程写在一起,那么就一定要使用它来区分,否则可以不用,同时begin和end可写可不写;

有参的存储过程:

CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`( in ids int,in namess varchar(200))
BEGIN
	select * from subject where id=ids; --将传过来的参数作为条件来查询数据
	update subject set subjectName=namess where id=ids; --对subject表的数据进行修改
	select ids; --打印出该变量的值
	select namess;
	set @sqlstatement=CONCAT('select * from subject where id=',ids);--动态的执行sql语句,使用concat方法将语句进行拼接,并定义一个用户变量
  prepare stmst from @sqlstatement; --将该语句进行预编译
  execute smts;   -- 执行该语句
  deallocate prepare smts;  --释放该sql语句占用的资源
END;

1.这个例子传的参数是in类型的,该类型的数据传参其中的in可以省略不写。

2.在多条语句的存储过程中每条语句在结束位置需要一个结束符。

3.mysql中的变量输出不能像SqlServer一样使用print,它是使用select来进行值输出的。

4.在存储过程中,字符串和变量的拼接只能使用concat来拼接,而不能使用+来拼接。

5.mysql的存储过程中,变量无需声明,可以直接使用set来设置一个变量。

6.动态执行sql语句最好在最后将资源释放,即deallocate prepare ****不要省略。

其余两种传入参数类型是out与inout,下次有时间在补上吧。

猜你喜欢

转载自blog.csdn.net/pttaoge/article/details/80769783