web-dev-qa-db-ja.com

関数(またはサブ関数)内の関数の一時テーブルを表示する

PL/pgSQLには2つの関数があります。

関数1は関数2を呼び出し、関数2は関数1で作成された一時テーブルを処理する必要があります。つまり、この一時テーブルは関数1コンテキスト(関数2が内部にある)でグローバルである必要があります。

FUNCTION1 
   | CREATE TEMPORARY TABLE
   | DO SOME SPECIFIC STUFF...
   | FUNCTION2
         | DO SOME GENERIC STUFF
         | INSERT SOME DATA INTO THE TEMPORARY TABLE  
         | (Uhh!! Ohh! it hurts, table not visible)
   | RAISED ON ERROR

関数1で作成された一時テーブルをこのサブ関数に渡す方法はありますか?

すべてのビッグデータを挿入する前に、一時テーブル内の多くのデータを処理する非常に大きな関数を使用しているので、それが必要ですが、よりモジュール化されたフォームに変換しようとすると、サブ関数は、一時テーブル)。

それは今では機能していますが(大きな1つの関数で)、CTRL + C CTRL + Vを実行して新しい類似の関数を作成しています。多くのコードをその中で繰り返すことができるためです。サブ関数を使用できる場合、このコードを複数回使用できるため、この問題は発生しません。

テーブルの名前を渡すことができます:

create or replace function f2(p_table_name text) returns text
  language plpgsql
as
$body$
begin
  execute $$insert into $$||quote_ident(p_table_name)||$$ (c1) values ('text1');$$;
  return 'ok';
end;
$body$;

create or replace function f1() returns text
  language plpgsql
as
$body$
declare 
  v1 text;
begin
  create temporary table t1 (
    c1 text
  );
  perform f2('t1');
  select c1 into v1 from t1 limit 1;
  return v1;
end;
$body$;

select f1();

それが動作するのを見てください: http://rextester.com/FYMX28296

1
Emilio Platzer