我正在尝试为我的 Opencart 商店创建 MySQL 存储过程。为了使产品可见,它必须位于 3 个表中
- oc_产品
- oc_product_description
- oc_product_to_store
因此,我插入到第一个表中,收集 ID 并使用该 ID 插入到以下表中。
如果我要在存储过程之外执行此操作,则所有单独的步骤都可以工作。但是,一旦我将它们全部放在一起(如下),我就会收到此错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @vProductID = (SELECT `product_id` FROM `oc_product` WHERE UPC='1234567890' ' at line 9
我的存储过程如下所示:
CREATE DEFINER=`myname`@`localhost` PROCEDURE `uspAddNewProduct`(IN `vModel` VARCHAR(500), IN `vSKU` VARCHAR(500), IN `vUPC` VARCHAR(500), IN `vMPN` VARCHAR(500), IN `vQTY` INT(10), IN `vPrice` DECIMAL(18,2), IN `vProductID` INT, IN `vProductName` VARCHAR(500), IN `vProductDescription` VARCHAR(500), IN `vMetaTitle` VARCHAR(500))
-- INSERTS THE BULK OF THE DATA INTO THE MAIN PRODUCT TABLE
INSERT INTO `oc_product` (`model`, `sku`, `upc`, `mpn`, `location`, `quantity`, `stock_status_id`, `image`, `shipping`, `price`, `tax_class_id`,`date_available`, `minimum`, `status`, `date_added`, `date_modified`, `weight_class_id`)
VALUES (vModel,vSKU,vUPC,vMPN,'NYC',vQTY,'5','catalog/product/' + vUPC + '.jpg','1',vPrice,'9',NOW(),'1','1',NOW(),NOW(),'1')
-- SELECTS THE RECENTLY CREATED PRODUCT ID
SET @vProductID = (SELECT `product_id` FROM `oc_product` WHERE UPC='1234567890' ORDER BY `product_id` DESC LIMIT 1)
-- INSERTS INTO A DESCRIPTION TABLE (BASED ON THE PID ABOVE)
INSERT INTO `oc_product_description` (`product_id`, `language_id`, `name`, `description`, `meta_title`)
VALUES (vProductID, '1', vProductName, vProductDescription, vMetaTitle)
-- ASSOCIATES THE PRODUCT WITH THE MAIN STORE (BASED ON THE PID ABOVE)
INSERT INTO `oc_product_to_store` (`product_id`, `store_id`) VALUES (vProductID, '1')
最佳答案
请小心变量vProductID
,它是一个存储过程参数,但随后在SET
中重新定义。请记住,vProductID
和 @vProductID
是不同的变量。
尝试:
DELIMITER //
CREATE DEFINER=`myname`@`localhost` PROCEDURE `uspAddNewProduct`(
IN `vModel` VARCHAR(500),
IN `vSKU` VARCHAR(500),
IN `vUPC` VARCHAR(500),
IN `vMPN` VARCHAR(500),
IN `vQTY` INT(10),
IN `vPrice` DECIMAL(18,2),
IN `vProductID` INT,
IN `vProductName` VARCHAR(500),
IN `vProductDescription` VARCHAR(500),
IN `vMetaTitle` VARCHAR(500)
)
BEGIN
-- INSERTS THE BULK OF THE DATA INTO THE MAIN PRODUCT TABLE
INSERT INTO `oc_product` (
`model`,
`sku`,
`upc`,
`mpn`,
`location`,
`quantity`,
`stock_status_id`,
`image`,
`shipping`,
`price`,
`tax_class_id`,
`date_available`,
`minimum`,
`status`,
`date_added`,
`date_modified`,
`weight_class_id`
) VALUES (
`vModel`,
`vSKU`,
`vUPC`,
`vMPN`,
'NYC',
`vQTY`,
'5',
CONCAT('catalog/product/', `vUPC`, '.jpg'),
'1',
`vPrice`,
'9',
NOW(),
'1',
'1',
NOW(),
NOW(),
'1'
);
-- SELECTS THE RECENTLY CREATED PRODUCT ID
-- SET @vProductID = (SELECT `product_id` FROM `oc_product` WHERE UPC='1234567890' ORDER BY `product_id` DESC LIMIT 1)
SET `vProductID` := (
SELECT `product_id`
FROM `oc_product`
WHERE `UPC` = '1234567890'
ORDER BY `product_id` DESC LIMIT 1
);
-- INSERTS INTO A DESCRIPTION TABLE (BASED ON THE PID ABOVE)
INSERT INTO `oc_product_description` (
`product_id`,
`language_id`,
`name`, `description`,
`meta_title`
) VALUES (
`vProductID`,
'1',
`vProductName`,
`vProductDescription`,
`vMetaTitle`
);
-- ASSOCIATES THE PRODUCT WITH THE MAIN STORE (BASED ON THE PID ABOVE)
INSERT INTO `oc_product_to_store` (
`product_id`,
`store_id`
) VALUES (
`vProductID`,
'1'
);
END//
DELIMITER ;
关于带有从 Select 声明的参数的 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26960820/