我想知道是否可以将参数传递给mysql存储过程并将此参数用作DATE_SUB函数的 unit 参数。似乎单元参数是一个保留字,所以我不知道是否有单位类型。
我想要做的事情的例子:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(param1 unit)
BEGIN
select DATE_SUB(now(), INTERVAL 1 param1);
END $$
DELIMITER ;
更新1 我尝试了一个prepare语句,我可以创建存储过程。
DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(param1 varchar(10))
BEGIN
PREPARE stmt FROM 'SELECT DATE_SUB(now(), INTERVAL 1 ?)';
EXECUTE stmt USING @param1;
END $$
DELIMITER ;
当我执行它时: CALL测试('WEEK'); 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行的“?)”附近使用正确的语法
答案 0 :(得分:2)
无论是否有预先准备好的声明,您在存储过程中都无法做到这一点。
你可以做类似的事情:
DELIMITER $$
DROP PROCEDURE IF EXISTS test_proc $$
CREATE PROCEDURE test_proc(param1 varchar(20))
BEGIN
CASE UPPER(param1)
WHEN 'MICROSECOND' THEN select DATE_SUB(now(), INTERVAL 1 MICROSECOND);
WHEN 'SECOND' THEN select DATE_SUB(now(), INTERVAL 1 SECOND);
WHEN 'MINUTE' THEN select DATE_SUB(now(), INTERVAL 1 MINUTE);
WHEN 'HOUR' THEN select DATE_SUB(now(), INTERVAL 1 HOUR);
WHEN 'DAY' THEN select DATE_SUB(now(), INTERVAL 1 DAY);
WHEN 'WEEK' THEN select DATE_SUB(now(), INTERVAL 1 WEEK);
WHEN 'MONTH' THEN select DATE_SUB(now(), INTERVAL 1 MONTH);
WHEN 'QUARTER' THEN select DATE_SUB(now(), INTERVAL 1 QUARTER);
WHEN 'YEAR' THEN select DATE_SUB(now(), INTERVAL 1 YEAR);
ELSE select 'UNEXPECTED UNIT';
END CASE;
END $$
DELIMITER ;