sql >> Databáze >  >> RDS >> PostgreSQL

Jak odlišit název proměnné plpgsql v klauzuli ON CONFLICT?

pro začátek name je špatný název pro proměnnou i atribut. Když máte obojí, kód nebude vypadat dobře. s ohledem na to můžete proměnnou předponovat označeným blokem (v příkladu níže <<fn>>``), and set variable_conflict` pro upřednostnění názvu sloupce, viz kód níže:

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

a dále - o tom je v podstatě celý odkaz.

A přesto - po ukázce, jak konkrétní úkol lze snadno provést pomocí plpgsql, stále cituji namual:



  1. Jak nainstaluji klienta MySQL příkazového řádku na Mac?

  2. Jak používat operátor BETWEEN v SQL Server

  3. MySQL SELECT posledních pár dní?

  4. PL/SQL Jak vrátit všechny atributy v ROW