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

PL/pgSQLでのレコードのタプル構造の宣言

    SETOFを返すための構文を混合しています 単一の行または値を返すための構文を持つ値。

    -関連する質問は-単一のレコード「r」をから返すにはどうすればよいですか

    RETURNS TABLEを使用して関数を宣言する場合 、RETURN NEXTを使用する必要があります 行(またはスカラー値)を返すために本文で。また、recordを使用する場合 一致する必要がある リターンタイプ。さらに下のコード例を参照してください。

    単一の値または行を返す

    1行だけを返したい場合は、必要ありません 未定義のタイプのレコードの場合。 @Kevinはすでに2つの方法を示しました。 OUTを使用して簡略化されたバージョンを追加します パラメータ:

    CREATE OR REPLACE FUNCTION my_func(OUT a integer, OUT b text)
       AS
    $func$
    BEGIN
       a := ...;
       b := ...;
    END
    $func$ LANGUAGE plpgsql;
    

    RETURN;を追加する必要もありません 関数本体で、宣言されたOUTの値 関数の最後にパラメータが自動的に返されます-NULL 割り当てられていないパラメータの場合。
    そして、RETURNS RECORDを宣言する必要はありません。 それはOUTからすでに明らかだからです パラメータ。

    行のセットを返します

    実際に複数を返したい場合 行(0行または1行の可能性を含む)では、戻りタイプをRETURNSとして定義できます。 ...

    • SETOF some_type 、ここでsome_type 登録済みのスカラー型または複合型にすることができます。

    • TABLE (col1 type1, col2 type2) -アドホックな行タイプの定義。

    • SETOF record プラスOUT 列の名前とタイプを定義するパラメータ。
      100%RETURNS TABLEと同等 。

    • SETOF record それ以上の定義なし。ただし、返される行は未定義です。 また、すべての呼び出しに列定義リストを含める必要があります(例を参照)。

    レコードタイプに関するマニュアル:

    レコード変数は行タイプの変数に似ていますが、事前定義された構造はありません。 SELECTまたはFORコマンドで割り当てられた行の実際の行構造を引き継ぎます。

    もっとあります、読む マニュアル。

    できます 定義されたタイプを割り当てずにレコード変数を使用すると、できます そのような未定義のレコードを返すことさえあります:

    CREATE OR REPLACE FUNCTION my_func()
      RETURNS SETOF record AS
    $func$
    DECLARE
        r record;
    BEGIN
        r := (1::int, 'foo'::text); RETURN NEXT r; -- works with undefined record
        r := (2::int, 'bar'::text); RETURN NEXT r;
    END
    $func$ LANGUAGE plpgsql;
    

    電話:

    SELECT * FROM my_func() AS x(a int, b text);
    

    しかし、これは非常に扱いにくい 呼び出しごとに列定義リストを提供する必要があるためです。通常、よりエレガントなものに置き換えることができます:

    • 関数の作成時にタイプがわかっている場合は、すぐに宣言してください(RETURNS TABLE または友達)。

    CREATE OR REPLACE FUNCTION my_func()
      RETURNS SETOF tbl_or_type AS
    $func$
    DECLARE
        r tbl_or_type;
    BEGIN
        SELECT INTO tbl_or_type  * FROM tbl WHERE id = 10;
        RETURN NEXT r;  -- type matches
    
        SELECT INTO tbl_or_type  * FROM tbl WHERE id = 12;
        RETURN NEXT r;
    
        -- Or simpler:
        RETURN QUERY
        SELECT * FROM tbl WHERE id = 14;
    END
    $func$ LANGUAGE plpgsql;
    
    • 関数呼び出しの時点でタイプを知っている場合 、ポリモーフィック型を使用するより洗練された方法があります。
      PL / pgSQL関数をリファクタリングして、さまざまなSELECTクエリの出力を返します

    正確に何が必要かについての質問は不明確です。



    1. MySqlのDATETIMEフィールドの日付部分にインデックスを作成するにはどうすればよいですか?

    2. RMANバックアップコマンド

    3. PL / SQLDeveloperを使用してリモートOracleDBに接続するにはどうすればよいですか?

    4. イミディエイトウィンドウの高速でダーティなForループ