2016-05-18 3 views
1
の有効度

に異なるDatagripは言うとMySQLで完全に次の手順を実行します、しかし、mysqlコマンドラインとワークベンチは、私のSQLの構文エラーがあると言います。どうしてこれなの?アクションとエラー出力は以下に再現されDataGripとMySQL Workbenchがストアドプロシージャ

mysql workbench error underline

:ここ

CREATE PROCEDURE addTag(n VARCHAR(255), d VARCHAR(255)) 
    BEGIN 
    INSERT INTO Tags(name, description) VALUES 
     (n, d); 
    END; 

はどのようにMySQLのワークベンチがそれを示しています。

PROCEDURE addTag(nはVARCHAR(255)、dはVARCHAR(255))INSERT INTOタグ(名前、説明)VALUESに(N、D)

エラーコードBEGIN、CREATE:あなたはあなたの中にエラーが発生している1064をSQL構文。あなたは私たちがお互いの文を分離する方法が必要になり、通常のSQLエディタでクエリを記述すると右の構文はライン4

+0

それは 'DELIMITER //'を必要と願っています。これを確認してください[投稿](http://stackoverflow.com/q/5703441/2451726) – Arulkumar

+0

@Arulkumarそれは働いた。しかし、なぜこれがmysqlに必要です。 – HSchmale

答えて

1

で「」の近くに使用するためにあなたのMySQLサーバのバージョンに対応するマニュアルを確認してください。これは、いわゆるデリミタによって行われます。デフォルトの区切り文字はセミコロン(変更可能です)です。

MySQLサーバは、また、記憶されたプログラム(ストアド・プロシージャ、関数、イベントなど)でステートメントを分離するためにセミコロンを使用します。サーバーは一度に1つのステートメントしか処理できないため、クライアントはスクリプトを個々のステートメントに分割する必要があります。これは、前述のデリミタを使用して行います。

ここで、ストアド・プログラムを書き込むときに、クライアントとサーバーのステートメントを分割するための区切り文字(セミコロンの両方)が互いに競合します。クライアントの区切り文字をクエリーに表示されない別のものに変更することはできません(文字列+コメントはカウントされません)。したがって、すべての(私の)SQLツールでは、この問題を回避するためにこのdelmiterを変更する機能があります。

しかし、つまりオブジェクトエディタでは、MySQL Workbenchのいくつかの助けがあります。データベース内の各オブジェクトタイプには、そのオブジェクトを管理するために特化されたオブジェクトエディタがあります。ストアドプロシージャ/機能のためだけcreate procedure又はcreate functionブロックを可能にするので、いいえ(クライアント)区切りが存在必要とされないことエディタがあります。

+0

なぜpostgresqlやsqlite(トリガを書くとき)はこれを強制しないのですか? – HSchmale

+0

Tbh、それは彼らがそれを必要としないことを私に驚かす。ステートメントを分割する必要があるSQLツールにも同じ原則が適用されます。しかし、デフォルトの区切り文字は異なるかもしれませんか? –