MySQL表名传参SP
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 good
with 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_B
from tabletest
)lz
order by A,lz.rn
)
select A1, A,max(B) as B from new_table
group by A1, A
union
select 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;
亲测好用!