定义
存储过程是存储在数据库目录中的一段声明性SQL语句。
优缺点
优点
- 具有更好的性能 存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,因此使用存储过程可以提高数据库执行速度。
- 减少网络传输 存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的SQL语句,而只需要发送存储过程的名称和参数。
- 更好的安全性 在通过网络调用过程时,只有对执行过程的调用是可见的。无法看到表和数据库对象名称,不能嵌入SQL 语句,有助于避免SQL注入攻击。
缺点
- 开发和维护要求比较高
存储过程的编写直接依赖于开发人员,如果业务逻辑改动较多,需要频繁直接操作数据库,大量业务降维到数据库,很多异常不能在代码中捕获,出现问题较难排查,需要数据库管理人员的帮助。
了解mysql执行dml语句的存储过程
mysql自带更新列的存储函数p_aa_updatecolumn
CREATE DEFINER=`root_admin`@`%` PROCEDURE `p_aa_updatecolumn`(IN tablename varchar(200), IN columnname varchar(200),
IN executeStr varchar(1000), IN executeType varchar(50))
BEGIN
DECLARE CurrentDatabase VARCHAR(100);
SELECT DATABASE() INTO CurrentDatabase;
SET @tablename = tablename;
SET @columnname = columnname;
SET @executeType = executeType;
SET @executeStr = executeStr;
SET @t_count = (SELECT COUNT(*) FROM information_schema.TABLES WHERE table_schema=CurrentDatabase AND TABLE_NAME=@tablename );
SET @count = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE table_schema=CurrentDatabase AND TABLE_NAME=@tablename AND COLUMN_NAME=@columnname);
IF @t_count > 0 THEN
IF @executeType = 'add' AND @count = 0 THEN
PREPARE stmt1 FROM @executeStr;
EXECUTE stmt1;
ELSEIF @executeType = 'alter' AND @count >0 THEN
PREPARE stmt1 FROM @executeStr;
EXECUTE stmt1;
END IF;
END IF;
END
解释
四个入参:tablename、columnname、executeStr(执行语句)、executeType(列操作类型)
p_aa_updatecolumn使用示例
call p_aa_updatecolumn('official_distribution_record','circulate_id','alter table `official_distribution_record` add column `circulate_id` varchar(36) COMMENT "传阅记录id" AFTER `status`','add');