Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / присваивание значения полю элемента массива записей / 11 сообщений из 11, страница 1 из 1
19.11.2015, 14:35
    #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
19.11.2015, 14:56
    #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
19.11.2015, 15:02
    #39107821
Nashev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
присваивание значения полю элемента массива записей
Maxim Boguk,

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

P.S. больно не пинайте, может задачу неправильно понял...
...
Рейтинг: 0 / 0
19.11.2015, 15:15
    #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
19.11.2015, 15:16
    #39107848
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
присваивание значения полю элемента массива записей
Nashev,

select array_agg(таблица) into переменная_массив from таблица;
...
Рейтинг: 0 / 0
19.11.2015, 15:40
    #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
19.11.2015, 16:04
    #39107914
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
присваивание значения полю элемента массива записей
NashevА ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом.Для типов фиксированной длины массив организован традиционно с индексной адресацией, а не связанным списком.
...
Рейтинг: 0 / 0
19.11.2015, 16:06
    #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
19.11.2015, 16:35
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / присваивание значения полю элемента массива записей / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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