Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование массива в хранимке / 11 сообщений из 11, страница 1 из 1
17.08.2014, 14:35:23
    #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
18.08.2014, 16:34:06
    #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
18.08.2014, 17:26:16
    #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
18.08.2014, 18:45:01
    #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
18.08.2014, 19:27:09
    #38722903
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива в хранимке
Viacheslav_mihalich,
Код: sql
1.
select 1 as "чо?", unnest(array[1,2,3,4,5,6,7,8,9]) as "жо!"; 


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

Эм. А примитивный цикл по массиву слишком просто сложно (потому что расписано в документации)?
...
Рейтинг: 0 / 0
19.08.2014, 07:18:26
    #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
19.08.2014, 17:16:11
    #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
19.08.2014, 18:12:55
    #38723756
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива в хранимке
Viacheslav_mihalich,

Оператор && предполагает, что справа и слева от него по массиву, у вас же слева множество кортежей, а справа — массив. Приводите либо левую часть к массиву через array_agg(), либо справа деайте unnest и заменяйте && на intersect.
...
Рейтинг: 0 / 0
19.08.2014, 19:58:11
    #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
20.08.2014, 23:33:19
    #38725082
Viacheslav_mihalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива в хранимке
--поправил,

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


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