動態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)
;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM