Передать несколько массивов в качестве входных данных функции в postgresql

У меня есть требование передать 2 массива в качестве входных данных для функции

массив 1: acct_num, зарплата и т. д.

массив 2: {1011, «Параматаа, Западное шоссе 100, блок 102»} {1012, «+ 61426999888»}

В приведенном выше примере массив 2 может быть динамическим, что означает, что они могут передавать до 500 ключей. Как обрабатывать каждый ключ массива и значение, потому что мне нужно хранить адресную информацию в таблице адресов, а номер телефона - в таблице PHONE.

Мне нужна помощь для доступа к каждому элементу в массиве, но я не знаю, как обработать второй элемент в массиве 2 (например: +61426999888)

CREATE OR REPLACE FUNCTION schema.test(
arraytext character varying[],
arraydomain character varying[][])
RETURNS integer AS
$BODY$
DECLARE 

BEGIN   


 p_v1_1    := arraytext[1];

 p_v2_1    := generate_subscripts($1, arraydomain[1]); --arraydomain[1];
 p_v2_2    := arraydomain[2]; 

raise notice 'p_v1_1 : %', p_v1_1;
raise notice 'p_v2_1 : %', p_v2_1;
raise notice 'p_v2_2 : %', p_v2_2;

 p_v2_3    := arraydomain[3];
 p_v2_4    := arraydomain[4]; 


raise notice 'p_v2_3 : %', p_v2_3;
raise notice 'p_v2_4 : %', p_v2_4;


        RETURN 0;
--EXCEPTION WHEN others THEN
  --      RETURN 1;
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Тогда использую:

SELECT * 
FROM schema.test(ARRAY['9361030699999'], ARRAY[['1011','Unit 102, 100 Wester highway, Paramataa'],['1012','+61426999888']]);
0
0
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот функция, показывающая несколько способов доступа к многомерным массивам. Можно просто пройтись по массиву, используя срез, что является самым простым способом - переменная c просто существует, поэтому я могу распечатать «внешний» индекс, в этом нет необходимости.

Другой способ - получить прямой доступ к значениям. Однако я не знаю, как получить каждый «подмассив» через доступ к индексу - например, ar[2:2] возвращает {{values}}, (ar[2:2])[1] возвращает NULL, а (ar[2:2])[1][1] возвращает значение элемента в подмассиве по этому индексу - средний, возвращающий NULL, - это то, чего я не понимаю. Если бы вы могли его получить, вы могли бы использовать ARRAY_UPPER для динамического доступа ко всем значениям без использования FOREACH / SLICE.

Также обратите внимание, что я не объявляю TEXT[][] - это не имеет значения.

CREATE OR REPLACE FUNCTION public.f1(ar TEXT[])
        RETURNS VOID AS
$BODY$
DECLARE
        _ar TEXT[];
        c INTEGER := 0;
BEGIN
        FOREACH _ar SLICE 1 IN ARRAY ar LOOP
                c := c + 1;
                FOR i IN 1..ARRAY_UPPER(_ar, 1) LOOP
                        RAISE NOTICE '%.%: %', c, i, _ar[i];
                END LOOP;
        END LOOP;

        RAISE NOTICE 'Alternative: %, %', (ar[2:2])[1][1], (ar[2:2])[1][2];
END
$BODY$
        LANGUAGE plpgsql IMMUTABLE;

Вызов:

SELECT * FROM public.f1(ARRAY[['1011','Unit 102, 100 Wester highway, Paramataa'],['1012','+61426999888']]);

Печать:

NOTICE:  1.1: 1011 
NOTICE:  1.2: Unit 102, 100 Wester highway, Paramataa 
NOTICE:  2.1: 1012 
NOTICE:  2.2: +61426999888 
NOTICE:  Alternative: 1012, +61426999888

Да, я согласен с вами, [] [] не имеет значения. Я попробую описать выше и обновлю результат

Harinath Arasu 10.09.2018 14:32

Другие вопросы по теме