2016-07-18 7 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; 

` 私が作ったコードは異なる位置で同じエラーを修正しようとしていたが、今私はそれが動作するようにする方法を伝えることはできません。

私はインサートを独立したケースにテストしましたが、うまくいきましたが、何も言えない場所でこれらの "デフォルト"エラーメッセージを保持する理由はわかりません。

EDIT:

私はIF..ELSE文でそれをやりました。

しかし、なぜ私はこれらのエラーが発生していたのか、そして(可能であれば)それが書かれている方法をどのようにしてできるのかを理解したいと思います。

おかげさまで、ありがとうございます。

+1

通常、良いアイデアは、機能するまでコメントアウトしてから、壊れるまで徐々に追加していくことです。これは間違いを見つけた –

+0

私はそれが唯一のパラメータ( 'IF EXISTS')であったときに私が一度それをすることを管理して以来、私はエラーを与えているラベルの' BEGIN..END'だと信じています。内容をコメントしようとする –

+0

「INSERT」とコメントしました。同じエラーが表示されました。 –

答えて

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; 
関連する問題