172 похожих чатов

Вопрос. Никто не может пояснить как вот этот код запустить в

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();

7 ответов

16 просмотров

Во-первых, в 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;

ks- Автор вопроса
Ilya Anfimov
Во-первых, в function в postgres вообще не можэт б...

написано, что ошибка после 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;

ks
написано, что ошибка после begin ставить ;

Это я на <Enter> случайно нажал.

ks
написано, что ошибка после begin ставить ;

Тому що это у тебя не тот begin, который начинает транзакцыю, а ключевое слово языка PL/pgSQL. Которое ограничивает блок исполнения языка PL/pgSQL.

ks
написано, что ошибка после begin ставить ;

Но тут никакой PL нафиг не нужэн, да и функцыи тожэ.

ks- Автор вопроса
Ilya Anfimov
Во-первых, в function в postgres вообще не можэт б...

ваш вариант решил проблему со скоростью. Всё равно, фигасе какой язык plsql медленный, неожиданно. Сейчас более важно. select * from testsize(); ИНФОРМАЦИЯ: 1440 kB ИНФОРМАЦИЯ: 2856 kB testsize ---------- 0 (1 строка) Думаю код не надо новый?

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта