DELIMITER $$CREATE PROCEDURE sp_dynamic_table_query(IN tablename VARCHAR(64),in some_value varchar(20))
BEGIN-- 定义查询字符串SET @query = CONCAT("SELECT * FROM ", tablename, " WHERE some_column = '",some_value,"'; --注意这里字符串要用单引号,否则会被解析成无效的引用,语法报错");-- 准备并执行动态查询PREPARE stmt FROM @query;EXECUTE stmt;-- 释放已准备的语句DEALLOCATE PREPARE stmt;--还可以写一堆,用with as + union没有一点问题,so far so goodwith new_table as (select * from(select * ,row_number()over(partition by A order by B desc) as rn,max(LEG1_TON)over(partition by A order by B desc) as max_B,min(LEG1_TON)over(partition by A order by B asc) as min_Bfrom tabletest)lzorder by A,lz.rn) select A1, A,max(B) as B from new_table group by A1, Aunionselect A1, A, leg1_ton from new_table where B = min_B;
END$$DELIMITER ;-- 调用存储过程
CALL sp_dynamic_table_query('your_table_name');
想看看动态的SQL如何可以打印出来看:
SELECT @query; -- 打印生成的动态 SQL
call 的时候不能指定声明的参数字段用 colA='XXX' 的形式,调用存储过程(CALL
)时不支持直接按参数名称传递参数。参数的传递只能按定义的顺序进行,并且必须全部传递。MySQL 的存储过程不像某些数据库(如 PostgreSQL 或 SQL Server)那样支持按名称传递参数的功能,
CALL example_procedure(param2 := 'Test String', param1 := 42, param3 := 99.99); - -这个不行
那如何制定参数?
--1, 创建给默认值
CREATE PROCEDURE example_procedure(IN param1 INT DEFAULT 0,IN param2 VARCHAR(255) DEFAULT 'Default String',IN param3 DECIMAL(10,2) DEFAULT 0.00
)
-- 调用可缺省
-- 或者提供部分参数
CALL example_procedure(42, 'Custom String');-- 2,为每个参数赋值
SET @param1 = 42;
SET @param2 = 'Test String';
SET @param3 = 99.99;-- 按顺序传递用户变量
CALL example_procedure(@param1, @param2, @param3);--3,使用动态 SQL(间接实现按名称传递参数)以毒攻毒
-- 通过动态构造 SQL,可以按参数名称拼接并执行对应的存储过程调用。需要结合 PREPARE 和EXECUTE 语句。-- 定义动态 SQL
SET @param1 = 42;
SET @param2 = 'Test String';
SET @param3 = 99.99;SET @sql = CONCAT('CALL example_procedure(', @param1, ', ', QUOTE(@param2), ', ', @param3, ')');-- 调试打印动态 SQL
SELECT @sql;-- 执行动态 SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
亲测好用!