Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql - как запомнить значение из пред. строки? / 10 сообщений из 10, страница 1 из 1
19.07.2020, 19:59
    #39981545
plpgsql - как запомнить значение из пред. строки?
подскажите пожалуйста, когда идёт перебор строк и мне надо из предыдущей строки значение из колонки col1 использовать в текущей строке и сравнить его с чем-то, манипуляции с ним поделать...
это через lag() только делается и повторным прогоном через WITH (или двумя), или таки можно как-то запомнить в переменную и поюзать на след. строчке в этом же потоке?
Это в любом языке можно сделать изи.
...
Рейтинг: 0 / 0
19.07.2020, 22:06
    #39981563
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql - как запомнить значение из пред. строки?
Алексей Роза,

обрабатывайте в цикле for... easy

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare
  x record;
  prevCol1 number := null;
begin
  for x in (SELECT Col1, b FROM t)
    loop
      ... здесь код
      prevA := x.Col1;
    end loop;
end;



для особых запущенных случаев - читаем про RETURN NEXT ... not easy
...
Рейтинг: 0 / 0
19.07.2020, 22:14
    #39981566
plpgsql - как запомнить значение из пред. строки?
о, спасибки
никогда его так не использовал, хоть и читал про это:
автор42.6.4. Цикл по результатам запроса

Другой вариант FOR позволяет организовать цикл по результатам запроса. Синтаксис:

[ <<метка>> ]
FOR цель IN запрос LOOP
операторы
END LOOP [ метка ];

Переменная "цель" может быть строковой переменной, переменной типа record или разделённым запятыми списком скалярных переменных.
Переменной "цель" последовательно присваиваются строки результата запроса, и для каждой строки выполняется тело цикла.
...
Рейтинг: 0 / 0
20.07.2020, 00:26
    #39981593
plpgsql - как запомнить значение из пред. строки?
а как, например, быть в случае, если внутри SELECT есть такое:
Код: sql
1.
WHERE extract(DOW FROM added) NOT IN (6,7) -- выкинуть выходные


а потом этот же extract(DOW ...) встречается уже внутри LOOP
его придётся считать 2 раза для каждой строчки?
...
Рейтинг: 0 / 0
22.07.2020, 01:03
    #39982463
plpgsql - как запомнить значение из пред. строки?
можно как-то получаемые строки собрать в некий record прямо в этой ф-и, чтобы потом разом их в INSERT вставить?
или надо отдельную ф-ю с return setof record ?
...
Рейтинг: 0 / 0
22.07.2020, 19:54
    #39982831
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql - как запомнить значение из пред. строки?
Алексей Роза,

да, можно. Создаете составной тип объявляете переменную с типом массив из строк вашего типа.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare 
  aMyVar complex[] := '{}';
  complex complex;
  nCount integer := 0;
begin
  aMyVar  := array_append(aMyVar, row(1.0,2.0));
  aMyVar  := array_append(aMyVar, row(2.0,2.0));
  aMyVar  := array_append(aMyVar, row(3.0,3.0));

  insert into myTable select * from unnest(aMyVar ) t;
end;
...
Рейтинг: 0 / 0
23.07.2020, 00:13
    #39982894
plpgsql - как запомнить значение из пред. строки?
Swa111, благодарю
у вас complex complex и nCount нигде не участвуют... Они зачем?
И зачем сделаны с одинаковыми названиями: complex[] И complex complex ?

И ещё важный вопрос: я подозреваю, что с т.з. производительности выгоднее будет всё таки ф-ей отдавать setof ?
...
Рейтинг: 0 / 0
23.07.2020, 20:40
    #39983342
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
plpgsql - как запомнить значение из пред. строки?
Алексей Роза,

complex complex; и nCount integer := 0; - было лишним хотел по другому записать добавление в массив через индексную переменную (в стиле Oracle), но вспомнил про функцию array_append.

complex[] - это массив
complex - это элемент массива (одна строчка)
...
Рейтинг: 0 / 0
26.07.2020, 23:28
    #39984175
plpgsql - как запомнить значение из пред. строки?
не хочет
Код: sql
1.
ОШИБКА:  функция array_append(agg_ua_t[], record) не существует


делал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TYPE agg_ua_t AS (uid int, from_ts timestamptz(0), to_ts timestamptz(0), gap smallint);

CREATE OR REPLACE FUNCTION f_foo()
RETURNS void LANGUAGE plpgsql AS $$

DECLARE
arr agg_ua_t[]  := '{}';

BEGIN
    arr := array_append(arr, row(333::int, '2020-06-01 10:20:30'::timestamptz(0), '2020-06-01 10:20:30'::timestamptz(0), 30::smallint));
    arr := array_append(arr, row(333::int, '2020-06-01 10:20:30'::timestamptz(0), '2020-06-01 10:20:30'::timestamptz(0), 30::smallint));
    arr := array_append(arr, row(333::int, '2020-06-01 10:20:30'::timestamptz(0), '2020-06-01 10:20:30'::timestamptz(0), 30::smallint));

    INSERT INTO agg_ua SELECT * FROM unnest(arr) t;

END
$$;
...
Рейтинг: 0 / 0
27.07.2020, 00:00
    #39984179
plpgsql - как запомнить значение из пред. строки?
в общем я сделал через вызов ф-и с setof record
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql - как запомнить значение из пред. строки? / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]