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

ON CONFLICT句でplpgsql変数名を明確にする方法は?

    まず、name 変数と属性の両方に不適切な名前です。両方があると、コードは見栄えが悪くなります。そのことを念頭に置いて、ラベル付きのブロック(例では<<fn>>``), and set variable_conflict`を使用して、列名を優先します。以下のコードを参照してください。

    t=# create or replace function func(
        name text
    ) returns void language plpgsql as
    $$
    #variable_conflict use_column
    <<fn>>
    declare name text :='blah';
    begin
        insert into test (name) values (name)
        on conflict (name) do            -- this no longer fails
        update set name = fn.name;
    end;
    $$;
    t=# insert into test select 'b';
    INSERT 0 1
    Time: 8.076 ms
    t=# select func('b');
     func
    ------
    
    (1 row)
    
    Time: 6.117 ms
    t=# select * from test;
     name
    ------
     b
     blah
    (2 rows)
    

    https://www.postgresql.org /docs/current/static/plpgsql-implementation.html#PLPGSQL-VAR-SUBST

    さらに、基本的にリンク全体がそれに関するものです。

    それでも、plpgsqlを使用してこれを簡単に実行できる特定のタスクを示した後でも、私はまだnamualを引用しています:



    1. 最近のリリースで新しく進化するPostgreSQLエンタープライズ機能

    2. MySqlConnection.StateChangeがフェッチされることはありません

    3. MySQLiはステートメントを準備し、REPLACE INTO

    4. OracleからDerbyへ-ConnectByおよびStartWithEquivalent in Derby