是否有使用LOAD XML LOCAL变量的变通方法?

时间:2016-10-31 17:55:33

标签: mysql

背景信息: 我有一个XML Feed,只允许我使用唯一的产品ID一次查找一个产品。

我编写了一个脚本,它从XML提要中获取结果,将它们放入一个临时的Mysql表中,将结果分组到一个字段中并添加一些格式,然后使用新信息更新我的主表并删除临时表。

效果很好。

问题是: 我必须为大约1000个产品执行此操作,并且我使用了LOAD XML LOCAL INFILE,我刚刚学到的不允许您在XML Feed的地址中使用变量等。

这意味着如果我手动更改Feed地址中的ID,然后运行它,我的脚本就会很好用。

不幸的是,当我有大约1000个产品ID时,我不需要运行这个脚本。我有一个单独的表,其中包含1000个产品ID(称为PRODUCT_ID_TABLE)。

问题: 是否有一种解决方法可以让您有效地将变量传递给LOAD XML LOCAL INFILE?

或者在我的PRODUCT_ID_TABLE中为所有产品ID运行脚本的另一种方法是什么?

CODE: 我不得不改变Feed地址,因为我不允许分享它。

/* set XML prodid into a variable */
SET @idinfo := ('17ENDUROEnduroSWCarbon650BLIMITEDFRM');

/* Creates my temporary table with 4 columns */
CREATE TABLE IF NOT EXISTS `temp` (
  `SPEC_NAME` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `SPEC_VALUE` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `prodid` varchar(5000) COLLATE utf8_unicode_ci NOT NULL,
  `spec` varchar(5000) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

/* Loads my XML into SPEC_NAME and SPEC_VALUE */
LOAD XML LOCAL INFILE 'http://FEEDADDRESSHERE.com/SBC/xml/FEEDNAMEHERE.jsp?feedType=getProductSpecs&productId=17ENDUROEnduroSWCarbon650BLIMITEDFRM'
INTO TABLE temp
ROWS IDENTIFIED BY '<SPECIFICATION>';

/* Concat SPEC_NAME and SPEC_VALUE into prodid, while also adding some formatting to be used later */
UPDATE temp SET prodid = CONCAT_WS(' ','<b>', NULLIF(TRIM(SPEC_NAME), ''),':</b>', NULLIF(TRIM(SPEC_VALUE), ''),'<br>');

/* group all rows from prodid together into one field value */
SET GLOBAL group_concat_max_len = 1000000;
SET @specinfo := (SELECT GROUP_CONCAT(prodid SEPARATOR ',') FROM temp GROUP BY NULL);

/* insert that value and xml product id uses access the xml into my temp table*/
insert into temp (prodid,spec) values(@idinfo,@specinfo);

/* Put the tyres info into a variable */
SET @tyres := (SELECT SPEC_VALUE FROM `temp` WHERE SPEC_NAME = 'FRONT TYRE');

/* update my main table with info from the temp table, then drop the temp table */
/* update product_id table with above values from temp table, where the product id's match */
UPDATE product_id t1 
        INNER JOIN temp t2 
             ON t1.ProductId = t2.prodid
SET t1.specification = t2.spec;

UPDATE product_id t1 
        INNER JOIN temp t2 
             ON t1.ProductId = t2.prodid
SET t1.tyres = @tyres;
DROP TABLE temp ;

0 个答案:

没有答案