sql >> データベース >  >> RDS >> PostgreSQL

plpgsqlで渡された特定のテーブルに基づいて、返される行タイプを動的に定義しますか?

    「既知のテーブルに基づく」とは、「既知のテーブルとまったく同じ」を意味する場合、はい

    SQLは厳密に型指定された言語であり、関数は明確に定義された戻り型で作成する必要があります。 匿名のレコードにフォールバックできます あなたが明らかにしたように(RETURNS SETOF record )。ただし、エラーメッセージに示されているように、呼び出しごとに列定義リストを追加する必要があります。次のようなもの:

    SELECT *
    FROM   my_function('foo') AS foo (
              colum_name1 integer  -- name and data type for every column
            , colum_name2 text
            , colum_name3 real);
    

    そして、これはほとんど動的ではありません。

    あなたの質問は解釈の余地がありますが、「既知の表に基づいて」 ポリモーフィック関数を示します トリックをするかもしれません。戻りタイプは、登録されている任意の行タイプに動的に基づくことができ、システム内のすべてのテーブルに自動的に1つあります。ベアボーンコードの例:

    CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
      RETURNS SETOF anyelement AS
    $func$
    BEGIN
       RETURN QUERY EXECUTE format(
         'SELECT * FROM %s LIMIT 10'
        , pg_typeof(_rowtype)  -- pg_typeof() returns regtype, quoted where necessary
          );
    END
    $func$ LANGUAGE plpgsql;
    

    電話:

    SELECT * FROM my_function(NULL::my_table);
    

    この関連する回答の詳細な手順(最後の章「さまざまな完全なテーブルタイプ」を参照してください。 ):




    1. スキーマサイズが表示されないのはなぜですか

    2. 突然削除に時間がかかる

    3. エラー1033は、スタンバイへのログオンを受信しました

    4. SSISで、処理する必要があるソースから返された行数を取得するにはどうすればよいですか。