2016-04-14 17 views
0

私はMySQLのストアドプロシージャについて学んでいますが、作成しようとしているプロシージャではちょっと困ります。私はそれを実行するとMySQLストアドプロシージャ初心者のエラー

CREATE PROCEDURE tag_inserts 
(
IN myTag VARCHAR(255), 
IN profileID INT(11) 
) 

BEGIN 

INSERT IGNORE INTO tags(tag) VALUES(myTag); 

SET @lid = LAST_INSERT_ID(); 

IF(@lid = 0, 
(SELECT tagid FROM tags WHERE tag = myTag), 
(INSERT INTO profile_hashtags (pid,tagid) VALUES (profileID,@lid))); 

END 

、それはあなたがあなたのSQL構文でエラーが発生している私に、次のエラー

を与えています。 INTO profile_hashtags(pid、tagid)VALUES(profileID、@ lid))))))の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルをチェックしてください。 END 'at line 13

答えて

2

ここで使用した関数は、条件式の条件付き評価を目的としています。また

-- Some client apps require DELIMITER directives, and some don't. 
DELIMITER // 

CREATE PROCEDURE tag_inserts (IN myTag VARCHAR(255), IN profileID INT(11)) 
    BEGIN 
    INSERT IGNORE INTO tags (tag) 
     VALUES (myTag); 
    SET @lid = LAST_INSERT_ID(); 
    IF @lid = 0 THEN 
     SELECT tagid 
     INTO @lid 
     FROM tags 
     WHERE tag = myTag; 
     INSERT INTO profile_hashtags 
      (pid, tagid) 
     VALUES 
      (profileID, @lid); 
    END IF; 
    END; 

-- Some client apps require DELIMITER directives, and some don't. 
// 
DELIMITER ; 

注手続き変数に選択された値を取得するために使用SELECT ... INTO構文:何が欲しいのは、このようになり、手続き-フロー制御IF compound statement syntax、です。

+0

ご説明いただきありがとうございます。ここに新しい出力があります。 SQLクエリ: はPROCEDUREのtag_insertsをCREATE(mytagというVARCHAR(255)では、profileIDをINT(11)IN)INSERT、タグ(タグ)INTO( 'mytagという' ) VALUESをIGNORE BEGIN; MySQLが言った:ドキュメント #1064 - SQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が近くにある行3で使用するようにしてください。 – user3701157

+0

あなたはどのクライアントを使用していますか? Workbench、 'mysql'、phpMyAdmin ...? –

+0

mysqlとMySQL WorkbenchなどのMySQLクライアントの中には、入力時に[DELIMITERディレクティブ](http://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html)を使用する必要があります複合ステートメント。私は上記の私のソリューションにそれらを追加しました。 –