0

このクエリは、名前と署名が指定されている関数のOIDを返します。

  select 'myfunc(signature)'::regprocedure::oid;

しかし、PostgreSQL plpgsqlにはmyNameAndSignature()関数のようなものがあるので、動的SQLを使用して、関数のOIDを取得し、一時テーブルの名前にOIDが追加された一時テーブルを作成するステートメントを作成できますか?
動的に実行するステートメントは次のとおりです。

create temp table TT17015

私はPostgreSQLを初めて使用します。一時テーブルの命名を処理するためのより良い方法があるので、一時テーブルを使用し、相互に呼び出す関数は、削除しようとしている特定の一時テーブルが含まれているというエラーを受け取りません。他の場所で使用しますか?

4

1 に答える 1

0

関数のOIDを使用しても、必ずしも名前の競合を防ぐことはできません。同じ関数を同じセッションで複数回実行できます。

一意の名前が必要な場合は、を使用してSEQUENCEください。データベースで1回実行します。

CREATE SEQUENCE tt_seq;

次に、plpgsql関数またはDOステートメントで次のようにします。

DO
$$
DECLARE
    _tbl text := 'tt' || nextval('tt_seq');
BEGIN
    EXECUTE 'CREATE TEMP TABLE ' || _tbl || '(id int)';
END
$$

欠点は、動的識別子に動的SQLを使用する必要があることです。プレーンSQLコマンドは、識別子のパラメーターを受け入れません。

于 2013-01-27T19:30:57.800 に答える