2017-11-03 244 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(這個答案不)。 –