PL/pgSQL . , "", PREPARE
. ( PL/pgSQL), , , , . , PREPARE
, , : . , , , , , :
SQL , PL/pgSQL
: plpgsql, .
, , - , , . : . , PL/pgSQL EXECUTE
: SQL EXECUTE selectTematicasPlan(minRowNum, maxRowNum, MIN_TEMS, MAX_TEMS)
. , ( Klin answer) , . , ( , ).
, :
DO $$
DECLARE
tt integer[];
minRowNum integer := 1;
maxRowNum integer := 357;
MIN_TEMS constant integer := 1;
MAX_TEMS constant integer := 15;
NUM_FILAS constant integer := 1000;
BEGIN
CREATE TEMP TABLE NTematica(rownum, tematica_id) AS
SELECT S.n, (S.n * 841)::integer
FROM generate_series(minRowNum, maxRowNum) S(n);
select
min(X.rownum), max(X.rownum) into minRowNum, maxRowNum
from
NTematica X;
FOR i IN 1..NUM_FILAS LOOP
SELECT array_agg(X.tematica_id) INTO tt
FROM NTematica X
WHERE X.rownum IN (
SELECT trunc(random() * (maxRowNum - minRowNum + 1) + minRowNum)::integer
FROM generate_series(MIN_TEMS, trunc(random() * (MAX_TEMS - MIN_TEMS + 1) + MIN_TEMS)::integer)
);
RAISE NOTICE 'First is % and % are the others', tt[1], tt[2:array_upper(tt)];
END LOOP;
DROP TABLE NTematica;
END; $$;
SQL, CTE :
WITH params(minRowNum integer, maxRowNum integer, MIN_TEMS integer, MAX_TEMS integer) AS
SELECT 1, 357, 1, 15
), rowNums(rwNum integer, tematica_id integer) AS (
SELECT S.n, (S.n * 841)::integer
FROM params, generate_series(params.minRowNum, params.maxRowNum) S(n)
)
SELECT tt[1] AS first, tt[2:array_upper(tt)] AS rest
FROM generate_series(1, 1000) ON true
JOIN (
SELECT array_agg(rw.tematica_id) AS tt
FROM params p, rowNums rw
WHERE rw.rwNum IN (
SELECT trunc(random() * (p.maxRowNum - p.minRowNum + 1) + p.minRowNum)::integer
FROM generate_series(p.MIN_TEMS, trunc(random() * (p.MAX_TEMS - p.MIN_TEMS + 1) + p.MIN_TEMS)::integer)
) agg ON true;
, , , . , , , TEMP TABLE
. , , 1000 .