首页 > 解决方案 > 将多个数组作为输入传递给 PostgreSQL 中的函数

问题描述

我需要将 2 个数组作为输入传递给函数

数组 1:acct_num、salary 等

数组 2:{1011,'Unit 102, 100 Wester Highway, Paramataa'} {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']]);

标签: postgresqlpostgresql-9.4

解决方案


这是一个显示访问多维数组的几种方法的函数。一个只是使用切片循环遍历数组,这是最简单的方法 -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

推荐阅读