powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / присваивание значения полю элемента массива записей
11 сообщений из 11, страница 1 из 1
присваивание значения полю элемента массива записей
    #39107791
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть array элементов типа record.
Но в этот массив записей почему-то нельзя селектить, и в поля элемента этого массива почему-то нельзя присваивать значение.
Что за беда?
Кто нибудь может ткнуть носом в документацию, по которой в 9.3 это должно не работать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
do language plpgsql $$
declare
  r my_table[];
  r1 my_table;
begin
  -- select * into r[1] from my_table where id = 1; -- не работает. Почему??
  -- найденный костыльный обход, который работает:
  select * into r1 from my_table where id = 1;
  r[1] := r1;

  -- r[1].my_field := 'test'; -- не работает. Почему??
  -- найденный костыльный обход, который работает:
  r1 := r[1];
  r1.my_field := 'test';
  r[1] := r1;
end;
$$



И есть ли костыльные обходы поэлегантнее?
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107811
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NashevЕсть array элементов типа record.
Но в этот массив записей почему-то нельзя селектить, и в поля элемента этого массива почему-то нельзя присваивать значение.
Что за беда?
Кто нибудь может ткнуть носом в документацию, по которой в 9.3 это должно не работать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
do language plpgsql $$
declare
  r my_table[];
  r1 my_table;
begin
  -- select * into r[1] from my_table where id = 1; -- не работает. Почему??
  -- найденный костыльный обход, который работает:
  select * into r1 from my_table where id = 1;
  r[1] := r1;

  -- r[1].my_field := 'test'; -- не работает. Почему??
  -- найденный костыльный обход, который работает:
  r1 := r[1];
  r1.my_field := 'test';
  r[1] := r1;
end;
$$



И есть ли костыльные обходы поэлегантнее?

попробуйте (r[1]).my_field := 'test'

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107821
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Код: sql
1.
2.
3.
ERROR:  syntax error at or near "("
LINE 10:   (r[1]).my_field := 'test'
           ^
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107837
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nashev,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DO language plpgsql $$
DECLARE
  r1 record;
BEGIN
  FOR r1 IN 
  SELECT * FROM my_table WHERE id = 1
  LOOP
    r1.my_field := 'some value';
  END LOOP;
END;
$$
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107839
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nashev,

P.S. больно не пинайте, может задачу неправильно понял...
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107846
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нагуглил, что первый мой вопрос обсуждался в http://postgresql.nabble.com/SELECT-INTO-array-i-with-PL-pgSQL-td3374982.html, и от тыкания в документацию тема ушла на советы просто так не делать, а делать иначе, не поэлементно, а через запрос массива целиком, через array() и array_agg(). Круто, полезно, но искомого ответа не даёт.

Попутно показали синтаксис вида
Код: sql
1.
b[i] := value FROM example WHERE row_id=i; 

который я тоже в документации обнаружить затрудняюсь. К тому же, при попытке таким макаром получить в переменную всю строку, а не одно поле, получаю ошибку вида ERROR: query "SELECT * from my_table where id = 1" returned 7 columns
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107848
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nashev,

select array_agg(таблица) into переменная_массив from таблица;
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107883
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В http://stackoverflow.com/questions/32702124/postgresql-slow-array-assignment пишут, что запись элемента в массив переписывает массив целиком (избавляются от этого, кажись, в 9.5 - http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1dc5ebc9077ab742). Кажись, присваивание полю элемента массива записей реализовывали бы ровно через такой же костыльный обход, что привёл я, но он хоть был бы не явный. Видимо, просто поленились, решив что это никому не надо. Но где про это в документации??

А ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом. И все везде советуют вместо массивов временные таблицы, а цикл по элементам массива делать не через индексы, а через разбор его в таблицу с помощью unnest и обращения вида
Код: sql
1.
2.
3.
FOR t_ IN SELECT unnest(a_) LOOP
  RAISE NOTICE '%', t_;
END LOOP;
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107914
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NashevА ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом.Для типов фиксированной длины массив организован традиционно с индексной адресацией, а не связанным списком.
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107921
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NashevВ http://stackoverflow.com/questions/32702124/postgresql-slow-array-assignment пишут, что запись элемента в массив переписывает массив целиком (избавляются от этого, кажись, в 9.5 - http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1dc5ebc9077ab742). Кажись, присваивание полю элемента массива записей реализовывали бы ровно через такой же костыльный обход, что привёл я, но он хоть был бы не явный. Видимо, просто поленились, решив что это никому не надо. Но где про это в документации??

А ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом. И все везде советуют вместо массивов временные таблицы, а цикл по элементам массива делать не через индексы, а через разбор его в таблицу с помощью unnest и обращения вида
Код: sql
1.
2.
3.
FOR t_ IN SELECT unnest(a_) LOOP
  RAISE NOTICE '%', t_;
END LOOP;



Такое обращение к элементам массива лучше или хуже из RTFM ?
...
Рейтинг: 0 / 0
присваивание значения полю элемента массива записей
    #39107972
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursidoNashev<>
Код: sql
1.
2.
3.
FOR t_ IN SELECT unnest(a_) LOOP
  RAISE NOTICE '%', t_;
END LOOP;



Такое обращение к элементам массива лучше или хуже из RTFM ?

безусловно лучше -- если вам надо работать с учетом измерения.
unnest разбивает массив на конечные элементы , т.е. на количесвто измерений ему плевать. В лупе по массиву вы можете указать [ SLICE number ].

а работать с присвоением элементу--компаунду надо так -- присваиваете компунд из массива переменной компаундного типа. меняете ей поля , присваиваете элементу массива значение из вашей переменной--компаунда. За количеством лишних присвоений по значению следить не приходится -- ешьте, что дают. Или используйте более другие процедурные ленгвичи
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / присваивание значения полю элемента массива записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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