Procedimento elementos como loops não fazem parte da linguagem SQL e só podem ser usados dentro do corpo de uma função de linguagem procedural, procedimento (Postgres 11 ou posterior) ou um
DO
declaração, onde tais elementos adicionais são definidos pela respectiva linguagem processual. O padrão é PL/pgSQL, mas existem outros. Exemplo com 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$;
Para muitas tarefas que podem ser resolvidas com um loop, há um baseado em conjunto mais curto e mais rápido solução ao virar da esquina. Equivalente de SQL puro para o seu exemplo:
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;
Sobre
generate_series()
:- Qual é o comportamento esperado para várias funções de retorno de conjunto na cláusula SELECT?
Sobre a otimização do desempenho de seleções aleatórias:
- Melhor maneira de selecionar linhas aleatórias PostgreSQL