自定义MySQL存储过程:根据表和条件生成INSERT语句
在MySQL中,"p_outInsertByTabelSql"是一个存储过程,用于根据给定的表名(in_table_name)和查询条件(in_table_sql)自动生成INSERT语句。这个过程主要涉及以下几个关键知识点: 1. **输入参数**: - `in_table_name`: 表的名称,作为字符串类型,用于指定要操作的表。 - `in_table_sql`: 查询条件,作为字符串类型,用于根据这些条件动态构建SQL语句。 2. **处理字段和数据类型**: - 存储过程通过`information_schema.columns`系统视图获取表结构,包括字段名(field)和数据类型(xtype),如`VARCHAR`、`INT`和`BIT`等。 - 对于整型(INT)字段,程序不会自动添加单引号,而对字符型(VARCHAR)和其他可能需要引号的数据类型,则会考虑添加单引号。 3. **使用CONCAT函数**: - 这个过程利用`CONCAT`函数来拼接字段值。如果字段值包含NULL,它可以处理这种情况。对于BIT类型,`CONCAT`可以正确地连接这些二进制数据,虽然通常在SQL中不需要直接拼接BIT类型,但这里展示了其可行性。 4. **循环遍历和生成INSERT语句**: - 存储过程通过`DECLARE`语句定义变量,如`field`、`xtype`、`done`等,分别用于存储字段名、数据类型和一个标志指示是否已找到所有列。 - 使用`DECLARE syscolumns_cursor cursor FOR`语句创建一个游标,遍历表的列,并在每次循环(loop_i)中处理一行数据。如果`done`标志为真,则跳出循环。 - 每次循环内,首先检查是否已结束,然后更新`@columndata`变量,以便在最终的`VALUES`子句中正确地添加逗号和空格。 5. **生成INSERT语句**: - 最后,程序将所有处理过的字段名和数据值组合成一个完整的INSERT语句,如`insert into mf_rele_form(TYPE_VARCHAR, TYPE_DATETIME, IS_NULL, TYPE_INT) values('EditLeaveApplication', '2020-11-11 17:10:46', NULL, 1);`,并将其存储在`@sql_counts`变量中。 6. **异常处理**: - 使用`DECLARE continue HANDLER for NOT FOUND`来处理没有更多结果的情况,设置`done`标志为true,确保不再尝试读取游标中的数据。 这个存储过程提供了一种自动化的方式来根据指定表和条件生成符合特定规则的INSERT语句,适合在需要大量插入操作或者频繁变动数据格式时使用。它结合了MySQL的元数据查询、字符串操作和条件逻辑,简化了数据导入过程。
begin
-- in_table_name,表名,in_table_sql,查询条件
-- 通过表查询条件输出insert语句 add lpf
-- 指定字段类型判断,是否输出单引号,如int不输出单引号,varchar输出单引号
-- concat支持null字符串拼接,
-- concat支持bit类型拼接
-- 输出示例如:insert mf_rele_form(TYPE_VARCHAR,TYPE_DATATIME,IS_NULL,TYPE_INT) values('EditLeaveApplication','2020-11-11 17:10:46',NULL,1);
declare filed varchar(50);
declare xtype longtext;
declare done int default false;
DECLARE syscolumns_cursor cursor FOR
SELECT COLUMN_NAME as filed,DATA_TYPE as xtype FROM information_schema.columns WHERE table_schema = 'agent' AND table_name = in_table_name;
declare continue HANDLER for not found set done = true;
set @columnfiled='',@columndata ='';
set @tablename=in_table_name;
set @sqlcounts='';
OPEN syscolumns_cursor;
loop_i:LOOP
FETCH NEXT from syscolumns_cursor INTO filed,xtype;
if done then
set @columndata :=(case when length(@columndata)=0 then @columndata else left(@columndata,length(@columndata)-2) end);
leave loop_i;
end if;
#select filed,xtype;
set @columnfiled:= concat(@columnfiled,(case when length(@columnfiled)=0 then'' else ','end),filed);
set @columndata:=concat(@columndata,
(case when length(@columndata)=0 then '' else ',' end),
(case when xtype in('varchar','char','longtext') then concat(''''''''',ifnull(',filed,',''NULL''),'''''',''')
when xtype in('int','double','tinyint','smallintbit','bigint') then concat('ifnull(',filed,',''NULL''),'',''')
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 2
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作