powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование массива в хранимке
11 сообщений из 11, страница 1 из 1
Использование массива в хранимке
    #38721920
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня,

1. Правильно ли для передачи в хранимку переменного количества целочисленных значений в качестве входящего параметра использовать массив? Или есть более удобный способ?

Задача: передать в процедуру несколько ID (каждый раз разное количество) и записать их в таблицу TEST.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE "TEST"
(
  "ID" bigint NOT NULL DEFAULT nextval('"ID_seq"'::regclass),
  "ID_TEST" bigint,
  CONSTRAINT "TEST_pkey" PRIMARY KEY ("ID")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "TEST"
  OWNER TO postgres;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION test(INOUT id_array bigint[], INOUT resultcode integer)
  RETURNS record AS
$BODY$
DECLARE
--	diagnostics_int_ar integer;
begin
		EXECUTE 'insert into "TEST"("ID_TEST") select unnest(a) from (select $1 as a) foo' 
		USING id_array;


--		GET DIAGNOSTICS diagnostics_int_ar = ROW_COUNT; 	    						
--		IF diagnostics_int_ar THEN resultcode := 0;
--		ELSE resultcode := 1; 
--		END IF;

end;
$BODY$
  LANGUAGE plpgsql 



вызов процедуры:
Код: plsql
1.
select test(array[1,2,3], -1);


Этот способ работает, но насколько он надежен и насколько коректна данная процедура?

2. Закомментированный код обычно использую для проверки успешного добавления в таблицу новой строки с выводом результата параметром resultcode. Как можно осуществить подобную проверку, когда в таблицу одновременно добавляется множество данных, как данном случае?
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38722686
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача немного усложняется:
Теперь еще с каждым элементом массива нужно передать одинаковый id.

Понятно, как передать в таблицу 2 массива одинаковой длины:
Код: plsql
1.
2.
		EXECUTE 'insert into "TEST"("ID_TEST1", "ID_TEST2") select unnest(a), unnest(b) from (select $1 as a, $2 as b) foo' 
		USING id_array1, id_array2;



А как сделать то же самое, но с каждым элементом первого массива передать один и тот же id?

Можно конечно задать второй массив из одинаковых id по количеству элементов первого массива. А потом передать 2 массива описанным способом. Но наверно это не самый лучший способ?
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38722751
--поправил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viacheslav_mihalich<>
Понятно [очевидно, вы сами не понимаете], как передать в таблицу 2 массива одинаковой длины:
Код: plsql
1.
2.
		EXECUTE 'insert into "TEST"("ID_TEST1", "ID_TEST2") select unnest(a), unnest(b) from (select $1 as a, $2 as b) foo' 
		USING id_array1, id_array2;


<>- это просто декартово произведение множеств элементов массивов ( произвольного соотношения длин)
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38722870
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно вы правы, но этот запрос делает почти то что нужно, раскладывает массивы в таблицу. Пока другого способа не знаю. Это и хочется выяснить.

Код: plsql
1.
insert into "TEST"("ID_TEST1", "ID_TEST2") select unnest(a), unnest(b) from (select array[1,3,5] as a, array[9,8,7] as b) foo;



Код: html
1.
2.
3.
4.
ID     ID_TEST1   ID_TEST2
 1        1           9
 2        3           8
 3        5           7



Основной вопрос в том, как одним запросом писать в таблицу массив произвольной длины (например array[1,3,5]) в столбец "ID_TEST1, а некое значение (например 1) в столбец ID_TEST2, чтобы получилось:

Код: html
1.
2.
3.
4.
ID     ID_TEST1   ID_TEST2
 1        1           1
 2        3           1
 3        5           1
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38722903
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
Viacheslav_mihalich,
Код: sql
1.
select 1 as "чо?", unnest(array[1,2,3,4,5,6,7,8,9]) as "жо!"; 


чо?жо!111213141516171819
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38722965
/\/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viacheslav_mihalich,

Эм. А примитивный цикл по массиву слишком просто сложно (потому что расписано в документации)?
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38723057
--поправил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viacheslav_mihalich<>

Основной вопрос в том, как одним запросом писать в таблицу массив произвольной длины (например array[1,3,5]) в столбец "ID_TEST1, а некое значение (например 1) в столбец ID_TEST2, чтобы получилось:
<>да нет никакого вопроса.
тут вот Ы налил воду в чайник и зажёг
, я позволю себе вылить и погасить:
Код: sql
1.
select unnest(array[1,3,5]) a, unnest(array[1]) b


--одно значение -- частный случай массива произвольной длины, ога

и писать -- как в доке написано INSERT INTO .... SELECT ...
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38723685
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--поправил,

Всем спасибо за ответы,
отдельное --поправил за уточнение.

Теперь при поиске общих элементов:

Код: plsql
1.
select ((select "ID_TEST" from "TEST") && ARRAY[1,2,3]);


ругается на оператор &&:

Код: plsql
1.
2.
3.
4.
ОШИБКА:  ОШИБКА:  оператор не существует: integer && integer[]
LINE 5: select ((select "ID_TEST" from "TEST") && ARRAY[1,2,3]);
                                               ^
HINT:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные преобразования типов.


Что-то недоустановлено или неправильно использую?
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38723756
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
Viacheslav_mihalich,

Оператор && предполагает, что справа и слева от него по массиву, у вас же слева множество кортежей, а справа — массив. Приводите либо левую часть к массиву через array_agg(), либо справа деайте unnest и заменяйте && на intersect.
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38723834
--поправил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viacheslav_mihalich<>

Код: plsql
1.
2.
--поправил
select (ARRAY(select "ID_TEST" from "TEST") && ARRAY[1,2,3]);


<>
Ы всё рассказал. Кроме, быть может, [ассимметричных(!)] форм операторов сравнения с массивами ANY|ALL "id=ANY(ARRAY[1,2,3])", которое эквивалент "id IN (1,2,3)"
видимо проинтуичил, что вам оно не надо
...
Рейтинг: 0 / 0
Использование массива в хранимке
    #38725082
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--поправил,

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


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