2017-11-03 7 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ストアドプロシージャのデータ値が正しくない

開始日と終了日のデータ型を 'date'に変更すると、不正な日付値を示すエラーメッセージが返されます。ビューは作成されますが、空です。

初めてこのウェブサイトを使用しています。みんなありがとう。

-------------------アップデート--------------

解決策が見つかりました。それは単に "日付の前と後に、この --- lud_dtm> =。" 追加された 'SetStartDate、' "とlud_dtm <"」、SetEndDate、 '";')

は見つけるために私に時間を要しましたアウト笑

+0

あなたは、VIEを作成することはできませんプロシージャで動的テーブル名を使用します。準備されたステートメントには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 CONCATENATE後:。。

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

はい。そうです。 –

+1

...これを手動で行うべきではありません。[QUOTE() '関数](https://dev.mysql.com/)のようになります。 '' where lud_dtm> = '、QUOTE(SetStartDate、)、' and ... 'は正しい答えですが、SQLでは脆弱ではありません注入と正しくNULLを処理する(この答えはしません)。 –

関連する問題