Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / двумерный массив. что не так делаю? / 18 сообщений из 18, страница 1 из 1
05.10.2015, 01:52
    #39068031
kkv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DO $$
DECLARE
  
  arr integer[][];
  
BEGIN
  arr[1][1]=0;  
  arr[1][2]=0; 
  
END $$;



выдаёт ошибку ERROR: array subscript out of range

если одну из строк закомментировать, то работает

что не так делаю?
...
Рейтинг: 0 / 0
05.10.2015, 02:34
    #39068036
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
kkv79,

многомерные массивы не могут быть расширены присвоением, коллизия прямоугольности нарушается. декларируй размерности или присвамвай целиком.
...
Рейтинг: 0 / 0
05.10.2015, 04:58
    #39068044
kkv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
p2.kkv79,
декларируй размерности

а это как?
...
Рейтинг: 0 / 0
05.10.2015, 08:38
    #39068073
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
kkv79p2.kkv79,
декларируй размерности

а это как?
вот да, присоединяюсь к вопросу.
в разделе http://www.postgresql.org/docs/current/static/plpgsql-declarations.html -- про объявление размерности в plpgsql уй ночевал. как бе хвалёная дока пж -- на поверку -- "кака всегда" .

кароче , как говаривал антон палыч --"люди, львы, козлы и pidarasy" .

вот тут тоже одно бухтение :
http://www.postgresql.org/message-id/op.t2j450qnll0p5y@1-rtt202dnf3uds.mshome.net]http://www.postgresql.org/message-id/op.t2j450qnll0p5y@1-rtt202dnf3uds.mshome.net

единственное что приходит -- зафилить предварительно нужный array руками:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DO $$
DECLARE
  
  arr integer[3][5];
  
BEGIN
	raise NOTICE '	arr	%',arr;
	arr:=array_fill(NULL::int, ARRAY[3,5]); 
	raise NOTICE '	arr	%',arr;
	arr[1][1]=0;  
	arr[1][2]=0;
	arr[3][5]=0;
	raise NOTICE '	arr	%',arr;
END $$;



в общем -- тьху на них
...
Рейтинг: 0 / 0
05.10.2015, 09:45
    #39068113
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
qwwq,

Странно. Здесь явно написано, как объявлять массивы, здесь - как конструировать.
Ни в одном из примеров никто не пытается обратиться к элементу массива до того как он сконструирован.

Как прикажете реагировать PG в случае присвоения к элементу массива, которого еще не существует (не объявлен ранее)?
...
Рейтинг: 0 / 0
05.10.2015, 09:59
    #39068124
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
qwwqединственное что приходит -- зафилить предварительно нужный array руками:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DO $$
DECLARE
  
  arr integer[3][5];
  
BEGIN
	raise NOTICE '	arr	%',arr;
	arr:=array_fill(NULL::int, ARRAY[3,5]); 
	raise NOTICE '	arr	%',arr;
	arr[1][1]=0;  
	arr[1][2]=0;
	arr[3][5]=0;
	raise NOTICE '	arr	%',arr;
END $$;

декларация уже задала размерности. "зафилить" или присвоить конструктор это альтернатива для массива с неуказанными размерностями [][].

ursidoКак прикажете реагировать PG в случае присвоения к элементу массива, которого еще не существует (не объявлен ранее)?Присвоение "создает" элемент и недостающие элементы размерности. Но не в случае многомерных массивов.postgresqlA stored array value can be enlarged by assigning to elements not already present. Any positions between those previously present and the newly assigned elements will be filled with nulls. For example, if array myarray currently has 4 elements, it will have six elements after an update that assigns to myarray[6]; myarray[5] will contain null. Currently, enlargement in this fashion is only allowed for one-dimensional arrays, not multidimensional arrays.
...
Рейтинг: 0 / 0
05.10.2015, 13:54
    #39068401
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
как сейчас помню -- тут было содержательное сообщение по поводу 2--х предыдущих выступлений
с их, неумолимо вытекающей из скрипта, оценкой.

короче -- воспроизведите сами. и помедитируйте.
...
Рейтинг: 0 / 0
05.10.2015, 13:59
    #39068408
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
p2.qwwqединственное что приходит -- зафилить предварительно нужный array руками:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DO $$
DECLARE
  
  arr integer[3][5];
  
BEGIN
	raise NOTICE '	arr	%',arr;
	arr:=array_fill(NULL::int, ARRAY[3,5]); -- комментировать тут
	raise NOTICE '	arr	%',arr;
	arr[1][1]=0;  
	arr[1][2]=0;
	arr[3][5]=0;
	raise NOTICE '	arr	%',arr;
END $$;

декларация уже задала размерности. "зафилить" или присвоить конструктор это альтернатива для массива с неуказанными размерностями [][].

ursidoКак прикажете реагировать PG в случае присвоения к элементу массива, которого еще не существует (не объявлен ранее)?Присвоение "создает" элемент и недостающие элементы размерности. Но не в случае многомерных массивов.postgresqlA stored array value can be enlarged by assigning to elements not already present. Any positions between those previously present and the newly assigned elements will be filled with nulls. For example, if array myarray currently has 4 elements, it will have six elements after an update that assigns to myarray[6]; myarray[5] will contain null. Currently, enlargement in this fashion is only allowed for one-dimensional arrays, not multidimensional arrays.
закомментируйте подсвеченную строчку

там не зря нотис предвыведен. если у кого со зрением швах.

//нашёл в кеше

урсидо явно не всасывает различие между SQL и plpgsql. и их декларациями . странно -- производил впечатление рассудительного человека.
...
Рейтинг: 0 / 0
05.10.2015, 14:38
    #39068453
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
qwwqурсидо явно не всасывает различие между SQL и plpgsql

Наверняка Вы сможете объяснить разницу в конкретном случае. Скорее всего спорный вопрос - конструирование/инициализация массива и обращение/присвоение значения конкретному элементу массива.
...
Рейтинг: 0 / 0
05.10.2015, 15:01
    #39068476
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
ursidoqwwqурсидо явно не всасывает различие между SQL и plpgsql

Наверняка Вы сможете объяснить разницу в конкретном случае. Скорее всего спорный вопрос - конструирование/инициализация массива и обращение/присвоение значения конкретному элементу массива.
а зачем ?
умного учить -- только портить.


вас не напрягает, что в каждом языке свои декларации ?
то что plpgsql работает как транслятор отдельных стейтментов в SQL не снимает с него обязанности обеспечить сносный язык деклараций.

то, что "задекларированный" массив [3][7] является массивом пустой длины
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DO $$
DECLARE
  
  arr integer[3][5];
  
BEGIN
	raise NOTICE '	arr	%',arr;
	--arr:=array_fill(NULL::int, ARRAY[3,5]); 
	--raise NOTICE '	arr	%',arr;
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	arr[1][1]=0;  
	raise NOTICE '	arr	%',arr;
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	
	arr[1][2]=0;
	raise NOTICE '	arr	%',arr;
	arr[3][5]=0;
	raise NOTICE '	arr	%',arr;
END $$;



, в который чудом можно запихать элемент [1][1], в каковом состоянии он приобретет свою размерность и перестанет быть вдувабельным -- это праздник деклараций какой--то.


а сделайте так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DO $$
DECLARE
  
  arr integer[3][5][5][5][5][5];
  
BEGIN
	raise NOTICE '	arr	%',arr;
	--arr:=array_fill(NULL::int, ARRAY[3,5]); 
	--raise NOTICE '	arr	%',arr;
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	arr[1][1]=0;  
	raise NOTICE '	arr	%',arr;
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	
	arr[1][2]=0;
	raise NOTICE '	arr	%',arr;
	arr[3][5]=0;
	raise NOTICE '	arr	%',arr;
END $$;



-- т.е. декларации размерности и размера массива в plpgsql попросту нет. это данность. размерность массив получает при заполнении.
...
Рейтинг: 0 / 0
05.10.2015, 15:06
    #39068484
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
ещё для медитаций:

брюки превращаются
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
DO $$
DECLARE
  
  arr integer[3];
  
BEGIN
	raise NOTICE '	arr	%',arr;
	arr:=array_fill(NULL::int, ARRAY[3,5]); 
	--raise NOTICE '	arr	%',arr;
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	arr:=array_fill(NULL::int, ARRAY[3,5,8]); 
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	arr:=array_fill(NULL::int, ARRAY[3,5,8,13]); 
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	arr[1][1]=0;  
	raise NOTICE '	arr	%',arr;
	raise NOTICE '	arr	%	%	%	%',array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr);
	
	arr[1][2]=0;
	raise NOTICE '	arr	%',arr;
	arr[3][5]=0;
	raise NOTICE '	arr	%',arr;
END $$;

...
Рейтинг: 0 / 0
05.10.2015, 15:19
    #39068510
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
qwwq,

Теперь Вам осталось только показать разницу с другим языком -- ту самую, которую я не понимаю. Подозреваю, что этот язык - "чистый" SQL.

То что Вы обнаружили - действительно так. Об этом английским языком написано в документации :
http://www.postgresql.org/docs/9.2/static/arrays.html However, the current implementation ignores any supplied array size limits, i.e., the behavior is the same as for arrays of unspecified length.

The current implementation does not enforce the declared number of dimensions either. Arrays of a particular element type are all considered to be of the same type, regardless of size or number of dimensions. So, declaring the array size or number of dimensions in CREATE TABLE is simply documentation; it does not affect run-time behavior.

В каком именно месте Вас обманули?
...
Рейтинг: 0 / 0
05.10.2015, 16:05
    #39068585
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
ursidoqwwq,
<>
В каком именно месте Вас обманули?
вы -- в том месте где вместо декларации plpgsql
авторпро объявление размерности в plpgsql
подсовываете ссылку на SQL.

// который -- тоже -- не декларация, а необязательное извещение о намерениях-- т.е. тут лохотроншики - сами авторы, хотя они это и честно признают. чем такие декларации -- лучше никаких.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BEGIn;
CREATE TABLE tttt (
    arr   integer[3][3]
);
INSERT INTO tttt  (arr)
VALUES (array_fill(NULL::int, ARRAY[3,5,8]))
,(array_fill(NULL::int, ARRAY[3]))
,(array_fill(NULL::int, ARRAY[3,5]));

SELECT *,array_ndims(arr), array_length(arr,1), array_length(arr,2),array_dims(arr) FROM tttt;



p2 -- там, где подсвечивает синтакс в DECLARE, не проверив, что он ничего на деле не задаёт.

итого:
1. декларации размерности массива не существует ни в SQL ни в plpgsql.
2. Массив получает размерность при заполнении.
3. одномерный массив автопополняем присвоением элемента за границей заполненного
4. двумерный -- нет (ну не шмогла, ага. лень было реализовывать)

к применению -- при необходимости расширить массив размерность более 1 -- имейте гемор -- например создайте проинициированный null or 0, и присвойте всем его младшим элементам значения из копируемого ....
...
Рейтинг: 0 / 0
05.10.2015, 16:21
    #39068607
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
qwwq,

О! Таким образом, мой обман заключается в том, что Вы не внимательно читаете документацию.

С моментом начала проблем с массивами - не согласен. Проблемы начинаются уже с момента принятия решения использования массивов.
...
Рейтинг: 0 / 0
05.10.2015, 16:47
    #39068640
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
ursidoqwwq,

О! Таким образом, мой обман заключается в том, что Вы не внимательно читаете документацию.

С моментом начала проблем с массивами - не согласен. Проблемы начинаются уже с момента принятия решения использования массивов.

напоминаю челу с говорящим ником

1. у ТС проблема в plpgsql
2. п2 рекомендует решить её декларацией размерности
3. ТС спрашивает как
4. я присоединяюсь к вопросу (пока всё -- про plpgsql)

5. и тут появляется, кхм, весь в белом, и тычет на доку , но уже про SQL

внимание -- вопрос: кто в этом треде лишний ?

-- ещё разжовывать ?

вас , кстати, не софтварером зовуть ? -- он вот всегда также ножку в третью позицию ставит
ха 20 оет так наловчился -- тоже небось подпольный урсус какой, а то и вовсе -- убыб. евпочя

пс. про то, что скл "декларация" ни к чему не обязывает -- я знаю давно, и не обращаю внимания. мне нужна декларация в процедурном языке, и именно декларация. а не пустышка.
...
Рейтинг: 0 / 0
05.10.2015, 18:07
    #39068704
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
qwwq1. у ТС проблема в plpgsql
2. п2 рекомендует решить её декларацией размерности
3. ТС спрашивает как
4. я присоединяюсь к вопросу (пока всё -- про plpgsql)
с декларацией размерности я ошибся.
...
Рейтинг: 0 / 0
05.10.2015, 18:52
    #39068727
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
p2.<>
с декларацией размерности я ошибся.
я многажды набиваю тут себе шишку.

поскольку оно редко надо -- я в память надолго не гружу.

и всякий раз, когда кто--то говорит, что это возможно -- стараюсь узнать -- как.
ну вот хотелось бы, да.
ан -- нет в жисти щасья
...
Рейтинг: 0 / 0
19.11.2015, 13:03
    #39107655
Nashev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
двумерный массив. что не так делаю?
сквозь дурацкие толпы клонов дурацкого родного постгрёвого списка рассылки, гугление выводит на https://wiki.postgresql.org/wiki/Matrices_Multidimensionales_con_funciones, где в итоге, кажись, предлагается расширять двумерный массив конкатенированием к нему новых одномерных.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / двумерный массив. что не так делаю? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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