2010-04-08 24 views
2

我想知道是否可以将参数传递给mysql存储过程,并使用此参数作为单元 DATE_SUB函数的参数。看来,单元参数是一个保留字,所以我不知道是否有单位类型。使用存储过程参数DATE_SUB的单位参数

为例的我想要做的事:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `test` $$ 
CREATE DEFINER=`root`@`%` PROCEDURE `test`(param1 unit) 
BEGIN 

select DATE_SUB(now(), INTERVAL 1 param1); 

END $$ 

DELIMITER ; 

更新1 我有准备的语句试过,我能够创建存储过程。

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试验( '周'); 你的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以便在第1行的'?'位置使用正确的语法。

回答

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 ; 
+0

这是另类我虽然。谢谢你的答案。 – Mike 2010-04-09 12:03:14