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つの機能の開始と終了の区切り文字を一致させる必要があります。
http://stackoverflow.com/questions/7013811を参照してください。その質問のRev1は現在のバージョンとはかなり異なっています – Drew