mysql 5.0 以后,才支持動態sql。這里介紹兩種在存儲過程中的動態sql:
1、第一種方式,拼接方式
示例:
CREATE PROCEDURE `proc_demo1`(in type VARCHAR(32),in id VARCHAR(32),in username VARCHAR(500))
BEGIN
# 定義變量
DECLARE var_sql VARCHAR(2000);
# 拼接sql
set var_sql = " select * from user where 1=1";
if type = 0 then
set var_sql = CONCAT(var_sql,' and id = ','\'',id,'\'');
end if;
if type =1 then
set var_sql = CONCAT(var_sql,' and username = ','\'',username,'\'');
END IF;
# select var_sql ;
set @sql = var_sql;
# 預處理動態sql語句
PREPARE stmt from @sql;
# 執行sql
EXECUTE stmt ;
# 釋放prepare
deallocate prepare stmt;
END
2、第二種方式,使用占位符方式
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_demo4`(in type varchar(32), in id varchar(32),in username varchar(500),in sex varchar(2000))
BEGIN
declare var_sql varchar(500);
set var_sql = " select * from user where 1=1";
if type =0 then
set var_sql =CONCAT(var_sql, " and id = ?");
# 參數賦值
set @id_param = id;
end if;
if type =1 then
set var_sql =CONCAT(var_sql, " and username = ?");
# 參數賦值
set @username_param = username;
end if;
if type =2 then
set var_sql =CONCAT(var_sql, " and sex find_in_set(sex,?) ");
# 參數賦值
set @sex_param = sex;
end if;
set @sql = var_sql;
PREPARE stmt FROM @sql;
# 執行sql,同時使用參數
if type = 0 then
EXECUTE stmt USING @id_param;
end if;
if type = 1 then
EXECUTE stmt USING @username_param;
end if;
if type = 2 then
EXECUTE stmt USING @sex_param;
end if;
deallocate prepare stmt;
END
關於存儲過程如何使用 in 條件:
find_in_set(字段,'aaa,bbb,ccc')
轉發需注明出處,歡迎交流! 1057449102@qq.com