2011-04-22 1 views
0

는 MySQL의 유효이 같은 것입니다 :MySQL의 IF ... THEN 쿼리 문 다음에

DELIMITER // 
CREATE FUNCTION LOGIN_VALIDATE(IN uName VARCHAR(32),IN uPass VARCHAR(32)) 
RETURNS BOOLEAN 
BEGIN 
    DECLARE row_count BOOLEAN DEFAULT 0; 
    DECLARE stored_pass VARCHAR(32) DEFAULT NULL; 
    DECLARE valid_return BOOLEAN DEFAULT 0; 
    SELECT count(*) INTO row_count FROM Login WHERE userId='uName'; 
    IF row_count = 1 THEN 
     SELECT pWord INTO stored_pass FROM Login WHERE userId='uName'; 
    END IF; 
    IF stored_pass = 'uPass' THEN 
     SET valid_return = 1; 
    END IF; 
    RETURN valid_return; 
END // 
DELIMITER ; 
+0

'userId'가'Login'의 기본 키가되어야한다고 생각합니까? 왜 첫 번째 쿼리를 row_count로 실행합니까? – Benoit

+0

예 userId는 기본 키입니다. 나는 그것을 나중에 비교하기 위해 row_count에 저장한다. – check123

답변

4

사용 :

항상
DECLARE valid_return BOOLEAN DEFAULT 0; 

SELECT CASE WHEN COUNT(*) = 1 THEN 1 ELSE 0 END 
    INTO valid_return 
    FROM LOGIN l 
WHERE l.userid = @uName 
    AND l.pword = @uPass 

하면 얻을 수있는 테이블을 통해 패스의 수를 최소화하려고 원하는 결과. SQL은 절차 적이 아닌 SET 기반입니다 - SQL은 올바르게 접근 할 때 더 잘 작동합니다.

+0

MySQL의 프롬프트가 BEGIN 근처에서 오류를 표시하는 동안 Mimer 유효성 검사기가 주요 구문 오류를주지 않으므로 논리가 작동하지 않는 이유는 무엇보다 당황 스럽습니다. – check123

+0

@ check123 : MySQL에서 참조 변수에 작은 따옴표를 사용하지 않습니다. MySQL은 단일 또는 이중 따옴표 내에서 "@"접두사가 필요합니다. –

+0

처음에는 작동하지 않았지만 @를 제거한 후 따옴표를 사용하지 않으면 작동했습니다. 감사! – check123