37.2. PL/pgSQLによる開発向けのヒント

PL/pgSQLで開発する一つの良い方法は、関数を作成するのに自分の好きなテキストエディタを使い、もう一つのウィンドウで、psqlを使用して関数を読み込ませて試験を行なうことです。 この方法で行う場合にはCREATE OR REPLACE FUNCTIONを使用して関数を作成する方がよいでしょう。 この方法によりファイルを再読み込みすることで、関数定義を更新することができます。 たとえば、以下のようにします。

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS '
          ....
end;
' LANGUAGE plpgsql;

psqlを実行し、以下のように関数定義ファイルを読み込み、または、再読み込みすることができます。

\i filename.sql

その後すぐに、関数を試験するためにSQLコマンドを発行することができます。

PL/pgSQLにおける開発のもう一つの良い方法は、手続き言語の開発機能を持つGUIデータベースアクセスツールを使用することです。 他にもありますが、PgAccessがこうしたツールの一例です。 こうしたツールは、単一引用符をエスケープさせたり、関数の作り直しやデバッグが容易に行えたりする便利な機能をよく持っています。

37.2.1. 引用符の扱い

PL/pgSQL関数のコードはCREATE FUNCTION内で文字列リテラルとして指定されますので、関数本体内部の単一引用符は二重にしてエスケープしなければなりません。 このため多くの場合、特に、項37.6.4に例示するような他の関数を生成する関数を作成する場合、複雑なコードになってしまいます。 以下の表は、様々な状況における引用符の必要数をまとめたもので、役に立つかもしれません。

1つの引用符

関数本体の先頭と末尾。 以下に例を示します。

CREATE FUNCTION foo() RETURNS integer AS '...'
    LANGUAGE plpgsql;

関数本体内では、引用符は必ずペアで現れます。

2つの引用符

関数本体内部の文字列リテラル用。 以下に例を示します。

a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';

PL/pgSQLから見ると2行目は以下のようになります。

SELECT * FROM users WHERE f_name='foobar';

4つの引用符

関数本体内部の文字列リテラル内の単一引用符がある場合。 以下に例を示します。

a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''

実際にa_outputに追加される値は、 AND name LIKE 'foobar' AND xyz.です。

6つの引用符

関数本体内部の文字列内の単一引用符が、文字列定数の末尾にある場合。 以下に例を示します。

a_output := a_output || '' AND name LIKE ''''foobar''''''

実際にa_outputに追加される値は、 AND name LIKE 'foobar'.です。

10個の引用符

文字列定数内に2つの単一引用符を持たせたい場合(これで8個の単一引用符になります)、かつ、この文字列定数の末尾にある場合(これで2個追加されます)。 おそらく、他の関数を生成する関数を作成する場合のみにこれが必要になるでしょう。 以下に例を示します。

a_output := a_output || '' if v_'' || 
    referrer_keys.kind || '' like '''''''''' 
    || referrer_keys.key_string || '''''''''' 
    then return ''''''  || referrer_keys.referrer_type 
    || ''''''; end if;''; 

a_outputの値は以下のようになります。

if v_... like ''...'' then return ''...''; end if;

関数本体内部で引用符をエスケープする別の方法として、二重にするのではなくバックスラッシュを使用する方法があります。 この方法を使えば''''の代わりに\'\'と書くことができることが判るでしょう。 これが維持を簡単にすると考える人も考えない人もいます。