psql? Вроде всё написал правильно, но он ругается на всё подряд. И я ещё ни одну функцию никогда не запускал.
CREATE FUNCTION testsize() RETURNS integer AS '
DECLARE
i integer;
BEGIN
create table testind (id serial, test int);
FOR i IN 1..65000 LOOP
INSERT INTO testind(test) values (i);
END LOOP;
create index indtest on testind(test);
select pg_size_pretty (pg_relation_size('indtest'));
FOR i IN 1..65000 LOOP
if ( (i % 2) == 0) delete from testind where id = i;
INSERT INTO testind(test) values (i);
END LOOP;
drop table testind;
END;
' LANGUAGE plpgsql;
select * from testsize();
Во-первых, в function в postgres вообще не можэт быть commit. Во-вторых, на самом деле такое пишэтся как begin; insert into testind (test) (SELECT * FROM generate_series(1,65000)); commit; begin; delete from testind WHERE test IN (SELECT generate_series*2 FROM generate_series(1,32500)); commit; begin; insert into testind (test) (SELECT generate_series*2 FROM generate_series(1,32500)); commit;
написано, что ошибка после begin ставить ;
Все ок, только у вас внутри задания тела функции через кавычки есть еще текстовое поле, которое так же в кавычках. Замените внешние кавычки задания функции на $$ CREATE FUNCTION testsize() RETURNS integer AS $$ DECLARE i integer; BEGIN create table testind (id serial, test int); FOR i IN 1..65000 LOOP INSERT INTO testind(test) values (i); END LOOP; create index indtest on testind(test); select pg_size_pretty (pg_relation_size('indtest')); FOR i IN 1..65000 LOOP if ( (i % 2) == 0) delete from testind where id = i; INSERT INTO testind(test) values (i); END LOOP; drop table testind; END; $$ LANGUAGE plpgsql;
Это я на <Enter> случайно нажал.
Тому що это у тебя не тот begin, который начинает транзакцыю, а ключевое слово языка PL/pgSQL. Которое ограничивает блок исполнения языка PL/pgSQL.
Но тут никакой PL нафиг не нужэн, да и функцыи тожэ.
ваш вариант решил проблему со скоростью. Всё равно, фигасе какой язык plsql медленный, неожиданно. Сейчас более важно. select * from testsize(); ИНФОРМАЦИЯ: 1440 kB ИНФОРМАЦИЯ: 2856 kB testsize ---------- 0 (1 строка) Думаю код не надо новый?
Обсуждают сегодня