mysql 替换SqlServer 的openXML 方法 (利用的是存储过程)

8 篇文章 0 订阅

写入存储过程

代码如下

CREATE  PROCEDURE `prcd_update`(IN xmlData text, OUT importSuccess int)
    COMMENT 

DROP TABLE IF EXISTS shop_level_tmptable;
-- 不存在则创建临时表
CREATE TEMPORARY TABLE
IF
NOT EXISTS shop_level_tmptable (
	ShopNO VARCHAR ( 100 ) PRIMARY KEY, 
	ShopName VARCHAR ( 255 ), 
	ShopType VARCHAR ( 255 ), 
	ShopClass VARCHAR ( 255 ), 
	DataStatus INTEGER 
);


TRUNCATE TABLE shop_level_tmptable;
-- 使用前先清空临时表

-- 从XML字串中抽取数据
SET
@shopNos := EXTRACTVALUE (xmlData, '/root/record/ShopNO');
SET
@shopNames := EXTRACTVALUE (xmlData, '/root/record/ShopName');
SET
@shopTypes := EXTRACTVALUE (xmlData, '/root/record/ShopType');
SET
@shopClasses := EXTRACTVALUE (xmlData, '/root/record/ShopClass');

-- 数据索引
SET @INDEX = 1;

-- 通过计算去除的空格数量统计有多少行数据
SET @shopNoCount = CHAR_LENGTH(@shopNos) - CHAR_LENGTH( REPLACE (@shopNos, ' ', '' ) ) + 1;

-- 循环向临时表插入数据
WHILE
@INDEX <= @shopNoCount DO

-- 从字串中截取单行数据,插入表中
SET @shopId = SUBSTRING_INDEX( SUBSTRING_INDEX( @shopNos, ' ',  @INDEX ), ' ',- 1 );
SET @shopName = SUBSTRING_INDEX( SUBSTRING_INDEX( @shopNames, ' ',  @INDEX ), ' ',- 1 );
SET @shopType = SUBSTRING_INDEX( SUBSTRING_INDEX( @shopTypes, ' ',  @INDEX ), ' ',- 1 );
SET @shopClass = SUBSTRING_INDEX( SUBSTRING_INDEX( @shopClasses, ' ',  @INDEX ), ' ',- 1 );

-- 执行插入 
INSERT INTO shop_level_tmptable(ShopNO, ShopName, ShopType, ShopClass, DataStatus)
VALUES
(@shopId, @shopName, @shopType, @shopClass, null);

-- 递增索引
SET @INDEX = @INDEX + 1;
END WHILE;

-- 验证数据
UPDATE shop_level_tmptable SET DataStatus = 1 WHERE ShopNo NOT IN (SELECT ShopID FROM Lenovo_ShopInfo);

-- UPDATE shop_level_tmptable SET DataStatus = 2 WHERE ShopType NOT IN ();

set importSuccess = 2;
END

SUBSTRING_INDEX的用法: •SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出现前,从字符串str返回自字符串。若count为正值,则返回最终定界符(从左边开始)

第一步得到的是  @shopNos 中如 3 4 5 利用空格分割的字符串

SET
@shopNos := EXTRACTVALUE (xmlData, '/root/record/ShopNO');

第二步计算得到 数据的行数

SET @shopNoCount = CHAR_LENGTH(@shopNos) - CHAR_LENGTH( REPLACE (@shopNos, ' ', '' ) ) + 1;

第三步利用循环将数据存入数据库

SET @shopId = SUBSTRING_INDEX( SUBSTRING_INDEX( @shopNos, ' ',  @INDEX ), ' ',- 1 );
-1是从右往左遇到第一个
2是从左往右遇到第二个
substring_index(@shopNos, '-', 2)表示截取
@shopNos 字符串的第二个 - 之 的所有字段 例如 1 2 3 截取 1 2
substring_index(str, '-', -1) 表示截取str字符串的从右往左第一个 - 之后的所有字段 例如 1 2 截取 2

举例:

CALL prcd_shop_level_update('
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<version>
		<t>BasicInformation</t>
		<v>2</v>
	</version>
	<record>
		<RowIndex name="序号">3</RowIndex>
		<ShopNO>454</ShopNO>
		<ShopName>1专卖店</ShopName>
		<ShopType>POP专卖店</ShopType>
		<ShopClass>星级</ShopClass>
	</record>
	<record>
		<RowIndex name="序号">4</RowIndex>
		<ShopNO>119</ShopNO>
		<ShopName>109店</ShopName>
		<ShopType>数码店</ShopType>
		<ShopClass>钻石级</ShopClass>
	</record>

</root>
', @res);
select @res;
select * from shop_level_tmptable;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javafanwk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值