动态SQL,通过变量实现动态更新、删除记录

mysql中prepare、execute、deallocate

MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT,即预处理语句

mysql预处理,可以防止注入攻击;能够通过占位符的方式,按照自己的指令安全的操作数据库以及数据库中的记录

  • prepare 进行预处理
  • execute 执行预处理SQL
  • deallocate 解除预处理SQL

一、更新记录

创建set_col_value执行过程,通过传入表名字段名字段值条件,进行记录的更新操作

delimiter $$  -- 界定符,即SQL语句的结束符。mysql中默认为英文分号';'
DROP PROCEDURE IF EXISTS set_col_value;
# 创建执行过程:通过动态SQL来更新记录
CREATE PROCEDURE set_col_value  
        (in_table   VARCHAR(128),  -- 表名
        in_column  VARCHAR(128),  -- 更新的字段
        in_new_value VARCHAR(1000),  -- 更新在字段值
        in_where   VARCHAR(4000))  -- 条件
    BEGIN
        DECLARE l_sql VARCHAR(4000);  -- 声明 sql 语句 变量
        # 拼接 sql 语句
        SET l_sql=CONCAT_ws(' ',  
           'UPDATE',in_table, -- 需要更新的表
             'SET',in_column,'=',in_new_value, -- 更新 in_column 字段的值为 in_new_value
           ' WHERE',in_where  -- 更新条件
        );
        SET @sql=l_sql;
        PREPARE s1 FROM @sql;  -- 预处理 SQL
        EXECUTE s1;  -- 执行 SQL
        DEALLOCATE PREPARE s1;  -- 释放 SQL
    END $$;
-- 调用
CALL set_col_value('DEPT','DNAME',"\'技术部\'",'DEPTNO=26');

二、删除记录

同理,创建执行过程,传入表名条件来删除相对应的记录

DELIMITER $$
DROP PROCEDURE IF EXISTS DELETE_VALUES;
CREATE PROCEDURE DELETE_VALUES(IN_TABLE VARCHAR(100),IN_WHERE VARCHAR(5000))
    BEGIN
        DECLARE EXC_SQL VARCHAR(4000);  -- 声明被执行的sql变量
        # 拼接 sql 语句
        SET EXC_SQL = CONCAT_ws(
            ' ',
            'DELETE','FROM',IN_TABLE,  -- 需要删除记录的表
            'WHERE',IN_WHERE  -- 删除的条件
            );
        SET @EXC_SQL = EXC_SQL;
        PREPARE TO_EXC_SQL FROM @EXC_SQL;  -- 预处理sql
        EXECUTE TO_EXC_SQL;  -- 执行 预处理SQL
        DEALLOCATE PREPARE TO_EXC_SQL;  -- 接触预处理sql
    END;
# 调用执行过程
CALL DELETE_VALUES('EMP','EMPNO=10');

三、测试的数据

# 创建数据库 ------- START
CREATE DATABASE DynamicSQL;
USE DynamicSQL;
# ------- END

# 创建表 ------- START
-- 创建部门表
DROP TABLE IF EXISTS DEPT;
CREATE TABLE DEPT(
    `DEPTNO` INT(11) NOT NULL AUTO_INCREMENT COMMENT '部门编号',
    `DNAME` VARCHAR(32) NOT NULL COMMENT '部门名称',
    `LOC` VARCHAR(200) DEFAULT 'CHINA' COMMENT '部门所在地',
    PRIMARY KEY DEPT(DEPTNO)
)AUTO_INCREMENT=01;

-- 创建职员表
DROP TABLE IF EXISTS EMP;
CREATE TABLE EMP(
    `EMPNO` INT(11) NOT NULL AUTO_INCREMENT UNIQUE COMMENT '雇员的编号',
    `ENAME` VARCHAR(32) NOT NULL COMMENT '雇员的名字',
    `JOB` VARCHAR(32) NOT NULL COMMENT '雇员的的职位',
    `MGR` INT(11) NULL COMMENT '上级主管编号',
    `HIREDATE` DATETIME NOT NULL COMMENT '入职(受雇)日期',
    `SAL` FLOAT NOT NULL DEFAULT 2000 COMMENT '薪金',
    `COMM` FLOAT NOT NULL DEFAULT 0 COMMENT '佣金',
    `DEPTNO` INT(11) NOT NULL COMMENT '部门编号',
    PRIMARY KEY EMP(EMPNO),
    FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
)AUTO_INCREMENT=1001;
# ------- END
SHOW TABLES;  -- 查看表是否创建成功
SHOW FULL COLUMNS FROM DEPT;  -- 查看DEPT表结构
SHOW FULL COLUMNS FROM EMP;  -- 查看EMP表结构

# 插入记录 ------- START
-- 插入部门表记录
INSERT INTO DEPT
VALUES
    (10,'总经理办公室','100'),
    (11,'CEO办公室','101'),
    (12,'行政部','102'),
    (13,'财务部','103'),
    (14,'管理部','104'),
    (21,'生产技术部','201'),
    (22,'人力资源部','202'),
    (23,'计划营销部','203'),
    (24,'安全监察部','204'),
    (25,'党群工作部','205'),
    (26,'后勤部','205'),
    (30,'股东会','300'),
    (31,'董事会','301'),
    (32,'监事会','302')
;
-- 插入职员表记录
INSERT INTO EMP
VALUES
    (01,'林青霞','总裁',NULL,'1997-01-01',100000,0,11),
    (02,'张玉漫','副总裁',01,'2000-01-01',80000,1000,11),
    (03,'郭富城','副总裁',01,'2003-03-01',80000,1000,11),
    (04,'刘德华','销售总经理',02,'2000-05-01',50000,0,10),
    (05,'古天乐','财务总经理',02,'2005-05-01',50000,800,10),
    (06,'陈奕迅','办事员',03,'2009-03-01',1000,800,30),
    (07,'张三','办事员',03,'2014-05-01',800,500,32),
    (08,'李四','保安',03,'2000-05-01',1500,200,22),
    (09,'Susan','前台',03,'2006-05-01',2200,90,13),
    (11,'WuSir','销售',03,'2018-05-01',2200,80,13),
    (12,'小晓','前台组长',NULL,'2002-02-02',5000,10000,11),
    (13,'李丽','前台副组长',NULL,'2003-02-02',4500,10000,11),
    (14,'Bob','技术部组长',NULL,'2008-02-02',1200,30000,11),
    (10,'Alex','临时督导',NULL,'2020-02-02',3000,10000,11)
;
posted @ 2020-06-12 16:06  langkye  阅读(1529)  评论(0编辑  收藏  举报