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

PL / pgSQL関数にレコードを渡す方法は?

    全体像に応じて、さまざまなオプションがあります。
    基本的に、挿入機能は次のように機能します。

    CREATE FUNCTION insert_thing (_thing flavored_view)
       RETURNS int AS
    $func$
       INSERT INTO things (name) VALUES ($1.name) -- plus 30 more columns
       RETURNING id;
    $func$ LANGUAGE sql;

    ビューの行タイプを使用する 、NEW トリガーにはこのタイプがあります。
    単純なSQL関数を使用します。これはインライン化でき、パフォーマンスが向上する可能性があります。

    デモコール:

    SELECT insert_thing('(1, foo, 1, bar)');
    

    トリガー内flavored_trig ()

    inserted_id := insert_thing(NEW);
    

    または、基本的に書き直しました:

    IF TG_OP = 'INSERT' THEN
       INSERT INTO flavored_things(thing_id, flavor)
       VALUES (insert_thing(NEW), NEW.flavor);
       RETURN NEW;
    ELSIF ...
    

    record はPL/pgSQLの外部では有効な型ではなく、PL / pgSQLのまだ不明な行型の一般的なプレースホルダーであるため、関数宣言の入力パラメータに使用することはできません。

    さまざまな行タイプを受け入れるより動的な関数の場合 を使用できます。ポリモーフィックタイプ 。例:



    1. インジェクションセーフなPostgresの一括挿入/更新。おそらく配列を取る関数ですか?

    2. SQLite Count()のしくみ

    3. SQLDeveloperを使用して大量のデータをエクスポートする方法-Oracle

    4. PL/SQLプログラムを中止します