背景信息: 我有一个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 ;