Procedure elementer som loops er ikke en del af SQL-sproget og kan kun bruges i brødteksten af en proceduresprogfunktion, procedure (Postgres 11 eller nyere) eller en DO
erklæring, hvor sådanne yderligere elementer er defineret af det respektive proceduresprog. Standarden er PL/pgSQL, men der er andre.
Eksempel med plpgsql:
DO
$do$
BEGIN
FOR i IN 1..25 LOOP
INSERT INTO playtime.meta_random_sample
(col_i, col_id) -- declare target columns!
SELECT i, id
FROM tbl
ORDER BY random()
LIMIT 15000;
END LOOP;
END
$do$;
Til mange opgaver, der kan løses med en loop, er der en kortere og hurtigere sætbaseret løsning rundt om hjørnet. Ren SQL-ækvivalent for dit eksempel:
INSERT INTO playtime.meta_random_sample (col_i, col_id)
SELECT t.*
FROM generate_series(1,25) i
CROSS JOIN LATERAL (
SELECT i, id
FROM tbl
ORDER BY random()
LIMIT 15000
) t;
Om generate_series()
:
- Hvad er den forventede adfærd for flere sæt-returnerende funktioner i SELECT-sætning?
Om optimering af ydeevne af tilfældige valg:
- Bedste måde at vælge tilfældige rækker PostgreSQL