PREPARE создает подготовленный оператор, который можно использовать «как есть». Если ваш подготовленный оператор возвращает одну строку, вы можете получить только одну строку. Вы не можете использовать его в других операциях, таких как вставка, например,
. В вашем случае вы можете создать функцию:
create or replace function dna_length(int) returns text as
$$
with t1 as (
select chr(65) as s
union
select chr(67)
union
select chr(71)
union
select chr(84))
, t2 as (select s,
row_number() over () as rn
from t1)
, t3 as (select generate_series(1, $1) as i,
round(random() * 4 + 0.5) as rn)
, t4 as (select t2.s
from t2
join t3 on (t2.rn = t3.rn))
select array_to_string(array(select s from t4), '') as dna
$$ language sql;
И использовать ее следующим образом:
insert into dna_table(g, dna) select generate_series(1,5), dna_length(20)
Из официального do c:
PREPARE создает подготовленный оператор. Подготовленный оператор - это объект на стороне сервера, который можно использовать для оптимизации производительности. Когда выполняется оператор PREPARE, указанный оператор анализируется, анализируется и переписывается. Когда впоследствии выполняется команда EXECUTE, подготовленный оператор планируется и выполняется. Такое разделение труда позволяет избежать повторяющихся операций анализа анализа, в то же время позволяя плану выполнения зависеть от заданных значений параметров c.
О функциях .