sql >> Database teknologi >  >> RDS >> PostgreSQL

Fejl ved indstilling af n_distinct ved hjælp af en plpgsql-variabel

Dette er ved design. Manualen forklarer i kapitlet Variabel substitution :

Variabel substitution fungerer i øjeblikket kun i SELECT , INSERT , UPDATE og DELETE kommandoer, fordi den primære SQL-motor kun tillader forespørgselsparametre i disse kommandoer. For at bruge et ikke-konstant navn eller værdi i andre sætningstyper (generisk kaldet utility-sætninger), skal du konstruere utility-sætningen som en streng og EXECUTE det.

Du kan ikke parametriser værdien i en dynamisk sætning med EXECUTE enten fordi, citerer kapitlet Udførelse af dynamiske kommandoer :

En anden begrænsning for parametersymboler er, at de kun virker i SELECT , INSERT , UPDATE og DELETE kommandoer. I andre sætningstyper (generelt kaldet utility statements), skal du indsætte værdier tekstuelt, selvom de kun er dataværdier.

Den eneste mulighed i en plpgsql-funktion er at sammenkæde værdien i kommandostrengen. Du kan bruge format() , men for det simple eksempel er almindelig sammenkædning sikker og nem::

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

Skema-kvalifikationen pg_temp. gør det til en (udokumenteret!) "midlertidig" funktion, hvilket afspejler spørgsmålet.
Manualen om n_distinct .




  1. Sådan tjekker du datoformatet for din Oracle-session

  2. MariaDB SUBSTR() Forklaret

  3. Sådan begrænser du MySQL-portadgang

  4. Sådan opdeles en kommasepareret værdi i kolonner