2017-11-03 245 views
0
DELIMITER // 
DROP PROCEDURE if exists mzeng.test2// 
CREATE PROCEDURE mzeng.test2(TerminalName VARCHAR(25),tablename varchar(25), SetStartDate datetime, SetEndDate datetime) 

BEGIN 
SET @t1 =CONCAT('create view mzeng.',tablename,' as SELECT * FROM ',TerminalName,'.restaurants where lud_dtm >= ', SetStartDate,' and lud_dtm < ',SetEndDate); 

PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 

end// 
DELIMITER ; 

call mzeng.test2('otg_ewrc1', 'EWRc1_TransactionalTable2','2017-07-01 04:00:00','2017-07-02 04:00:00'); 

此处日期的数据类型应该是'datetime'。但是,当我调用过程时,它会返回错误代码,说明检查正确的语法。MySQL存储过程中的数据值不正确

当我将开始日期和结束日期的数据类型更改为'日期'时,调用返回错误消息,表示日期值不正确。该视图虽然创建,但它是空的。

第一次使用本网站。多谢你们。

-------------------更新--------------

我找到了解决方案。它只是简单地增加 “这之前和之后的日期 ---其中lud_dtm> =”。 'SetStartDate,' “和lud_dtm <””,SetEndDate, '“;')

我花时间找。出笑

+0

您不能创建VIE ws在过程中使用动态表名。编写的语句不得包含DDL指令(例如创建视图,创建表或类似语句),只允许DML指令 – Psi

+0

我相信我可以。我有另一个不需要使用日期作为参数的查询,它工作得很好。 –

回答

1

必须连接后

SET @t1 =CONCAT('create view mzeng.',tablename,' as SELECT * FROM ' 
     ,TerminalName,'.restaurants ' 
     ,'where lud_dtm >= \'', SetStartDate,'\' and lud_dtm < \'',SetEndDate,'\''); 

的restult逃避单引号字符(')包围的时间字符串:

"... lud_dtm >= '2017-07-01 04:00:00' and lud_dtm < '2017-07-02 04:00:00' " 
+0

是的。它是。和“工作也是一样的,拿到它,花了我几个小时才算出来, –

+1

除了......你不应该手动做这个,这就是['QUOTE()'函数](https://dev.mysql.com/ doc/refman/5.7/en/string-functions.html#function_quote)for。''其中lud_dtm> =',QUOTE(SetStartDate,),'和...'是正确的答案。注入并正确处理NULL(这个答案不)。 –