240604-存储过程(了解mysql执行dml语句的存储过程)

130 阅读2分钟

定义

存储过程是存储在数据库目录中的一段声明性SQL语句。

优缺点

优点

  1. 具有更好的性能 存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,因此使用存储过程可以提高数据库执行速度。
  2. 减少网络传输 存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的SQL语句,而只需要发送存储过程的名称和参数。
  3. 更好的安全性 在通过网络调用过程时,只有对执行过程的调用是可见的。无法看到表和数据库对象名称,不能嵌入SQL 语句,有助于避免SQL注入攻击。

缺点

  1. 开发和维护要求比较高
    存储过程的编写直接依赖于开发人员,如果业务逻辑改动较多,需要频繁直接操作数据库,大量业务降维到数据库,很多异常不能在代码中捕获,出现问题较难排查,需要数据库管理人员的帮助。

了解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');