2017-11-03 4 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을 만들 수 없습니다 프로 시저에서 동적 테이블 이름을 사용합니다. 준비된 문은 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/)가 있습니다. doc/refman/5.7/ko/string-functions.html # function_quote)은 다음과 같습니다 :''where lud_dtm> = ', QUOTE (SetStartDate,),'and ...'는 정답입니다 .SQL에 취약하지 않습니다. 주입 (injection)하고 정확하게 NULL을 처리한다 (이 대답은 그렇지 않다). –