2016-07-18 2 views
0

그래서 데이터가 있는지 확인하고 두 테이블에 값을 삽입 할 경우이 절차를 만들려고했습니다.Proc 만들기 END 문에 1064/42000 오류를 반환합니다

그러나 나는 다음과 같은 오류가 코드를 실행하면

여기

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 40. Error 1064. SQLSTATE 42000

는 프로 시저 코드입니다.

CREATE PROCEDURE PRI_NEW_CLI(
    IN TELEFONE VARCHAR(20), 
    IN EMAIL VARCHAR(50), 
    IN CPF VARCHAR(11), 
    IN SENHA VARCHAR(255), 
    IN NOME VARCHAR(255), 
    IN SOBRENOME VARCHAR(255), 
    OUT NEW_ID INT, 
    OUT C_ERR VARCHAR(5), 
    OUT T_ERR VARCHAR(255) 
) 
BEGIN  
newcli:BEGIN 

    IF EXISTS(SELECT (1) FROM USERS u WHERE u.T_URS_TEL = TELEFONE) THEN 
     SET C_ERR = '10001'; 
     SET T_ERR = 'TELEFONE EXISTENTE NA BASE DE DADOS'; 
     LEAVE newcli; 
    END IF; 

    IF EXISTS(SELECT 1 FROM USERS u WHERE u.T_USR_EMAIL = EMAIL) THEN 
     SET C_ERR = '10002'; 
     SET T_ERR = 'EMAIL EXISTENTE NA BASE DE DADOS'; 
     LEAVE newcli; 
    END IF; 

    IF EXISTS(SELECT 1 FROM F_USERS f WHERE f.T_DOC_CPF = CPF) THEN 
     SET C_ERR = "10003"; 
     SET T_ERR = "CPF EXISTENTE NA BASE DE DADOS"; 
     LEAVE newcli; 
    END IF; 

    INSERT INTO USERS (T_USR_EMAIL, T_URS_TEL, T_USR_PASS, F_TYPE) 
    SELECT EMAIL, TELEFONE, MD5(SENHA), 'C'; 

    SET NEW_ID = LAST_INSERT_ID(); 

    INSERT INTO F_USERS (USER_ID, T_FIRSTNAME, T_LASTNAME, T_DOC_CPF) 
    SELECT NEW_ID, NOME, SOBRENOME, CPF; 
END newcli; 
END; 

` 내가 다른 위치에 동일한 오류를 해결하기 위해 노력했지만, 지금은 그것을 작동하는 방법을 말할 수 없다 만든 코드입니다.

격리 된 케이스에 인서트를 테스트했지만 정상적으로 작동했지만 아무런 이유없이 "기본"오류 메시지가 표시되는 이유를 알 수 없습니다.

편집 :

내가 IF..ELSE 진술로했다.

그러나 나는 아직도 내가 왜 그 오류를 얻었는지 이해하고 싶다. 그리고 가능하다면 어떻게 쓰는지를 이해할 수있다.

도움을 주셔서 감사합니다.

+1

일반적으로 좋은 생각은 작동 할 때까지 내용을 주석으로 처리하고 휴식 할 때까지 점차적으로 물건을 추가하기 시작하는 것입니다. 이것은 실수를 찾는다 –

+0

나는 그것이 오류를 내고있는'BEGIN..END'라고 믿는다. 왜냐하면 나는 그것을 검증하기위한 하나의 매개 변수 일 때만 관리했기 때문에 ('IF EXISTS'), 나는 물건을 주석하려고 시도하십시오 –

+0

'INSERT's에 댓글을 달았습니다. 동일한 오류가 발생했습니다. –

답변

0

슬프게도 나는 왜 그 오류를 내고 있는지 알 수 없었다.

코드가 변경되어 작동했습니다.

하지만 코드를 작성한 방식으로 코드를 작성하는 데 관심이 있습니다.

여기에 새 코드가 있습니다.

CREATE PROCEDURE PRI_NEW_CLI(
    IN TELEFONE VARCHAR(20), 
    IN EMAIL VARCHAR(50), 
    IN CPF VARCHAR(11), 
    IN SENHA VARCHAR(255), 
    IN NOME VARCHAR(255), 
    IN SOBRENOME VARCHAR(255), 
    OUT NEW_ID INT, 
    OUT C_ERR VARCHAR(5), 
    OUT T_ERR VARCHAR(255) 
) 
BEGIN  

    IF NOT EXISTS(SELECT (1) FROM USERS u WHERE u.T_URS_TEL = TELEFONE) THEN 
     IF NOT EXISTS(SELECT (1) FROM USERS u WHERE u.T_USR_EMAIL = EMAIL) THEN 
      IF NOT EXISTS(SELECT (1) FROM F_USERS f WHERE f.T_DOC_CPF = CPF) THEN 

       INSERT INTO USERS (T_USR_EMAIL, T_URS_TEL, T_USR_PASS, F_TYPE) 
       SELECT EMAIL, TELEFONE, MD5(SENHA), 'C'; 

       SET NEW_ID = LAST_INSERT_ID(); 

       INSERT INTO F_USERS (USER_ID, T_FIRSTNAME, T_LASTNAME, T_DOC_CPF) 
       SELECT NEW_ID, NOME, SOBRENOME, CPF; 

      ELSE 
       SET C_ERR = "10003"; 
       SET T_ERR = "CPF EXISTENTE NA BASE DE DADOS"; 
      END IF; 
      ELSE 
       SET C_ERR = '10002'; 
       SET T_ERR = 'EMAIL EXISTENTE NA BASE DE DADOS'; 
      END IF; 
    ELSE 
     SET C_ERR = '10001'; 
     SET T_ERR = 'TELEFONE EXISTENTE NA BASE DE DADOS'; 
    END IF; 

END; 
관련 문제