sql >> Databasteknik >  >> RDS >> PostgreSQL

Fel vid inställning av n_distinct med en plpgsql-variabel

Detta är designat. Handboken förklarar i kapitlet Variabelsubstitution :

Variabelsubstitution fungerar för närvarande endast i SELECT , INSERT , UPDATE och DELETE kommandon, eftersom den huvudsakliga SQL-motorn tillåter frågeparametrar endast i dessa kommandon. För att använda ett icke-konstant namn eller värde i andra programsatser (allmänt kallade verktygssatser), måste du konstruera verktygssatsen som en sträng och EXECUTE det.

Du kan inte parametrisera värdet i en dynamisk sats med EXECUTE antingen för att, citerar kapitlet Utföra dynamiska kommandon :

En annan begränsning för parametersymboler är att de bara fungerar i SELECT , INSERT , UPDATE och DELETE kommandon. I andra programsatser (allmänt kallade verktygssatser) måste du infoga värden textuellt även om de bara är datavärden.

Det enda alternativet i en plpgsql-funktion är att sammanfoga värdet i kommandosträngen. Du kan använda format() , men för det enkla exemplet är vanlig sammanlänkning säker och enkel::

CREATE OR REPLACE FUNCTION pg_temp.setdistinct(_cnt real)
  RETURNS void
  LANGUAGE plpgsql AS
$$
BEGIN
   EXECUTE 'ALTER TABLE _temp ALTER COLUMN id SET (n_distinct=' || _cnt || ')';
END
$$;

Schema-kvalifikationen pg_temp. gör det till en (odokumenterad!) "tillfällig" funktion, vilket speglar frågan.
Manualen om n_distinct .




  1. Subtrahera månader från ett datum i PostgreSQL

  2. Enkel Slony-I replikeringsinställning.

  3. Hur läser man alla rader från en enorm tabell?

  4. Hur justify_days() fungerar i PostgreSQL