2016-08-31 58 views
1

私はこれを見て回った後に、この一見簡単な仕事を行うために長く複雑な方法があるので、これを行う方法を知りたいと思います。 はMySQLでは、我々はストアドプロシージャやfuntionsを使用したいときは本当に便利だったpostgreSQLの区切り文字を変更する簡単な方法

DELIMITER // 
...function start 
INSERT INTO table VALUES (1); 
...function end// 
DELIMITER ; 

を持っていました。私はpostgreSQLでこれと同等のものがあるかどうかを探しています。

ありがとうございます!

+0

http://stackoverflow.com/questions/7013811を参照してください。その質問のRev1は現在のバージョンとはかなり異なっています – Drew

答えて

1

MySQL DELIMITERの問題は、PostgreSQLではかなり異なっています。まず、ほとんどのプログラマは関数を入力するのにpsqlコマンドラインを使用せず、代わりにSQLスクリプトファイルを作成して実行しますが、これはあなたの質問のポイントの外にあります)。

PostgreSQLでは、関数本体は基本的に長い文字列です。その文字列は、基本的に他のものと競合しないもので区切ることができます。 SQL標準とPostgreSQLのドキュメントでは、MySQLのように引用符で囲まれていない関数本体を単に起動するのではなく、一重引用符'が使用されています。したがって、関数ヘッダ(CREATE FUNCTION ...)を書くときには、その関数内で文を終了するセミコロンを書く前に、関数本体を開始するための引用符を書くことになります。これは、セミコロンでMySQLの問題がPostgreSQLに存在しないことを意味します。パーサーは文字列を読み込んで、その文字列が閉じ引用符で終わってから、コマンドがセミコロンで終了するのを待っています。

しかし、それ以上です。

PostgreSQLでは、機能本体を開始するのに'の代わりに$$または$anything_goes_here$、いわゆるドルの引用符を使用するのが慣例です。これは、関数本体に埋め込み引用符をエスケープする必要がないためです。この機能の説明については、the docsを参照してください。 、最も顕著なのPL/pgSQLに、内蔵の手続き言語、だけでなく、Perlのの変異体 - 他のプログラミング言語は、PostgreSQLでもあること

CREATE FUNCTION my_func(arg1 data_type, ...) RETURNS data_type AS $body$ 
    INSERT INTO foo(my_column) VALUES(arg1) 
    RETURNING some_column; 
$body$ LANGUAGE sql; 

注:

ジェネリック関数の定義は、やや、このようになります。 Python、Tcl、C、... - すべてがデリミタを含む同じ関数定義構文(SQL標準と同じ)を使用するため、関数本体のみが異なります。

異なる機能に異なるデリミタを使用することもできますが、1つの機能の開始と終了の区切り文字を一致させる必要があります。

+0

私の問題についてのあなたのスルーアウトの説明をありがとう、私はそれについて素敵な把握を持っていると思います今。ドキュメントへのリンクも非常に助かりました。Patrick氏に感謝します。 – Dragonturtle

関連する問題