当前位置: 首页 > article >正文

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;

亲测好用!


http://www.kler.cn/a/449852.html

相关文章:

  • 使用idea创建JDK8的SpringBoot项目
  • 使用GPT进行SCI论文润色常用语句
  • 解决 Docker 中 DataLoader 多进程错误:共享内存不足
  • 练14:DFS基础
  • leetcode-128.最长连续序列-day14
  • CE之植物大战僵尸植物无冷却
  • Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
  • Windows开启IIS后依然出现http error 503.the service is unavailable
  • 使用 ffmpeg 拼接合并视频文件
  • 代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
  • 软考——RIP路由协议
  • 数据结构漫游记:静态链表的实现(CPP)
  • HTTP常见异常状态码
  • Android Bootable Recovery 中的 `bspatch.cpp` 文件详解
  • Tauri 开源 - 从零打造一款跨端的 AI 笔记
  • ubuntu 网络管理
  • Clickhouse 集群配置
  • Linux系统卡顿排查
  • PostgreSql+Pgpool-II配置高可用集群(超详细)
  • scrapy实战之新浪新闻爬虫
  • Linux 批量查找与替换的常用命令
  • C++中的字符串实现
  • ACl访问控制列表
  • 高校就业管理:系统设计与实现的全流程分析
  • 如何写好一份科技报告
  • Textual Dataset Distillation via Language Model Embedding