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