IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL 存储过程 表名互换 -> 正文阅读

[大数据]MySQL 存储过程 表名互换

代码:

# 自定义结束符号,为 '$$'
delimiter $$
create procedure rename_table(in v_table_name varchar(255), in v_tmp_table_name varchar(255))
begin
	# 定义变量
    declare temp_table_name varchar(255);
    # 给变量赋值
	set temp_table_name = CONCAT(v_table_name, '_',  date_format(current_date, '%Y%m%d'));
		
	#定义语句
    set @sql_str = concat('alter table ',v_table_name, ' rename to ', temp_table_name, ';');
	#预定义sql语句,从用户变量中获取
    prepare sql_str from @sql_str;
	#执行sql语句
    execute sql_str;
    #deallocate prepare sql_str;
		
	set @sql_str = concat('alter table ',v_tmp_table_name, ' rename to ', v_table_name, ';');
    prepare sql_str from @sql_str;
    execute sql_str;
    #deallocate prepare sql_str;
		
	set @sql_str = concat('alter table ',temp_table_name, ' rename to ', v_tmp_table_name, ';');
    prepare sql_str from @sql_str;
    execute sql_str;
	#释放资源
    deallocate prepare sql_str;

end
$$
# 将初始修改的结束符号恢复为,';'
delimiter ;

注意点

  • 为什么要自定义结束符号呢?因为 MySQL 默认的结束符号为 ';',遇到 ';' 就会执行语句, 而存储过程中是由多条 sql 语句组合而成的,每条语句之间都是以 ';' 分割的,如果我们没有声明分隔符的话,MySQL 会将存储过程当成 sql 语句来执行,则存储过程的编译过程会报错,所以我们要事先修改 MySQL 默认的结束符号,来使我们可以正确执行创建存储过程的语句,用完之后还要把分隔符还原。(注意:以上所说都是在使用命令行的方式创建存储过程时)

  • MySQL默认不支持表名作为变量名。

若有存储过程如下:

drop procedure if exists selectByTableName;
create procedure selectByTableName(in tableName varchar(50))
begin
    select * from tableName;
end;

在调用存储过程时会报错:

call selectByTableName('emp');
> 1146 - Table 'db_name.tablename' doesn't exist
> 时间: 0s

原因是它把变量 tableName 作为了表名,并不是把传入的值作为表名。
如果要解决上述问题的话,可以使用 concat 函数,然后用预处理语句出入动态表名来执行 sql,对于增删改查都适用。

将上述存储过程修改为:

drop procedure if exists selectByTableName;
create procedure selectByTableName(in tableName varchar(50))
begin
    #定义语句
    set @sql_str = concat('select * from ',tableName);
    #预定义sql语句,从用户变量中获取
    prepare sql_str from @sql_str ;
    #执行sql语句
    execute sql_str ;
    #释放资源,后续还可以使用
    deallocate prepare sql_str;
end;

再调用时就能正常查询出结果了。在预处理语句中,使用了用户变量,变量名是自定义的。

创建存储过程格式

delimiter 自定义结束符号
create procedure sp_name([in, out, inout] 参数名 数据类型...)
begin
	# 定义变量
	# declare variable_name [,variable_name...] datatype [default value];
    sql语句;
end
自定义结束符号
delimiter ;

调用存储过程

call sp_name([参数|@参数]);
--@参数:可用来接收存储过程输出结果

删除存储过程

drop procedure sp_name;

参考文章:
https://www.cnblogs.com/zys2019/p/15171722.html

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:59:31  更:2022-09-30 01:02:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:10:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码