web-dev-qa-db-ja.com

%TYPEを使用したPL / pgSQL関数のテンプレートタイプの配列

PostgreSQLデータベースと、現在コピーされた型(IN arg_1 table_1.column_1%TYPEなど)の引数を持つPL/pgSQL関数があります。

それらを更新したいので、これらの引数の1つは、実際にはそのコピーされたタイプの要素の配列です。 「通常の」タイプの場合は、タイプの後に[]を追加するだけです。たとえば、IN arg_1 integer[]のようにします。そのロジックに従って、%TYPEの直後に角括弧を追加しようとしましたが、構文エラーが発生しました。

Postgresのドキュメントでは何も見つかりませんでした。また、私のgoogle fuで有用な回答が得られませんでした。
どうすればそれを達成できますか?

3
Felipe Ruiz

%TYPE構文 正確なタイプのみをコピーできます。ただし、配列の型に応じて登録する簡単な回避策があります。目的の配列の型で(一時的な)テーブルまたはビューを作成します。

テンプレートテーブル:

CREATE TABLE foo (i int);

(一時)配列型を登録するためのビュー、オプションで空(LIMIT 0):

CREATE TEMP VIEW v_foo_i_arr AS
SELECT ARRAY (SELECT i FROM foo LIMIT 0) AS i_arr;

Or(一時)テーブル:

CREATE TEMP TABLE foo_i_arr AS
SELECT ARRAY (SELECT i FROM foo LIMIT 0) AS i_arr;

これで関数が機能します:

CREATE OR REPLACE FUNCTION f_arr_test(v_foo_i_arr.i_arr%TYPE)
  RETURNS foo.i%TYPE AS  -- example: return element type
$func$
BEGIN
   RETURN $1[2];
END
$func$  LANGUAGE plpgsql;

temporaryビューまたはテーブルにすることもできます。関数のシグネチャの型は基になる型にすぐに変換されます。使用されたテンプレートへの永続的な接続はありません。したがって、セッションの終了時に一時オブジェクトが削除されても問題ありません。

ポリモーフィック型

あなたmightは、まず ポリモーフィックタイプ を使用することをお勧めします。これはany配列型で機能します:

CREATE OR REPLACE FUNCTION f_arr_test_polymorphic(ANYARRAY)
  RETURNS ANYELEMENT AS  -- derived from input type
$func$
BEGIN
   RETURN $1[2];
END
$func$  LANGUAGE plpgsql;

SQLフィドル

%TYPE宣言inside関数本体は、各セッションの最初の呼び出しでシステムカタログ内の型を検索するという点で、実際に動的に機能します。

SOに関する関連質問:

2