sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-loops buiten functies. Is dat mogelijk?

Je kan niet DECLARE (globale) variabelen (er zijn tijdelijke oplossingen ) noch loop met gewone SQL - met uitzondering van recursieve CTE's zoals geleverd door @bma (wat eigenlijk itererend is over rijen, strikt genomen niet in een lus).

Echter , er is de DO verklaring voor een dergelijke ad-hoc procedurele code. Geïntroduceerd met Postgres 9.0. Het werkt als een eenmalige functie, maar neemt geen parameters in beslag en retourneert niets. U kunt RAISE mededelingen et al, dus uw voorbeeld zou prima werken:

DO
$do$
DECLARE
   _counter int := 0;
BEGIN
   WHILE _counter < 10
   LOOP
      _counter := _counter + 1;
      RAISE NOTICE 'The counter is %', _counter;  -- coerced to text automatically
   END LOOP;
END
$do$

Indien niet anders gespecificeerd, is de taal in de body standaard plpgsql . U kunt elke geregistreerde proceduretaal gebruiken echter, als je het declareert (zoals:LANGUAGE plpython ).

Postgres biedt ook generate_series() om ad-hoc sets te genereren, wat in veel gevallen de noodzaak van looping overbodig maakt. Probeer hier op SO te zoeken voor voorbeelden.

U kunt ook de WHERE . gebruiken clausule in een gegevensmodificerende CTE in gewone SQL om gevallen te forken en IF .. THEN .. ELSE .. END te emuleren ...



  1. Een Peer-to-Peer Lending Platform-gegevensmodel

  2. GAE Python - Geen module met de naam MySQLdb

  3. is MySql goed voor grote databases?

  4. Oracle Database Developer Choice Awards