sql >> Database >  >> RDS >> PostgreSQL

Fout bij het instellen van n_distinct met behulp van een plpgsql-variabele

Dit is ontworpen. De handleiding geeft uitleg in het hoofdstuk Variabele vervanging :

Variabele vervanging werkt momenteel alleen in SELECT , INSERT , UPDATE ,en DELETE commando's, omdat de hoofd-SQL-engine alleen in deze commando's queryparameters toestaat. Om een ​​niet-constante naam of waarde te gebruiken in andere instructietypen (in het algemeen utility-instructies genoemd), moet u de utility-instructie als een tekenreeks construeren en EXECUTE het.

Je kan niet parametriseer de waarde in een dynamisch statement met EXECUTE ofwel omdat, onder verwijzing naar het hoofdstuk Dynamische commando's uitvoeren :

Een andere beperking op parametersymbolen is dat ze alleen werken inSELECT , INSERT , UPDATE , en DELETE commando's. In andere typen instructie (in het algemeen hulpprogramma-instructies genoemd), moet u tekstueel waarden invoegen, zelfs als het alleen gegevenswaarden zijn.

De enige optie in een plpgsql-functie is om de waarde samen te voegen in de opdrachtreeks. Je zou kunnen gebruiken format() , maar voor het eenvoudige voorbeeld is eenvoudige aaneenschakeling veilig en gemakkelijk::

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
$$;

De schema-kwalificatie pg_temp. maakt er een (ongedocumenteerde!) "tijdelijke" functie van, die de vraag weerspiegelt.
De handleiding over n_distinct .




  1. Hoe de implementatie van PostgreSQL-database te automatiseren

  2. Verzamelmethoden:EERSTE &LAATSTE functies in Oracle Database

  3. Importeer meerdere CSV-bestanden naar SQL Server vanuit een map

  4. Oracle kritieke patch-update – oktober 2020