передать несколько массивов в качестве входных данных для функции в PostgreSQL - PullRequest
0 голосов
/ 10 сентября 2018

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

массив 1: acct_num, оклад и т. Д.

массив 2: {1011, 'Блок 102, шоссе Wester 100, Параматаа'} {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']]);

1 Ответ

0 голосов
/ 10 сентября 2018

Вот функция, показывающая несколько способов доступа к многомерным массивам. Один из них просто перебирает массив с помощью слайса, что является самым простым способом - переменная 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
...