将多个数组作为输入传递给 PostgreSQL 中的函数
pass multiple arrays as input to a function in PostgreSQL
我需要传递 2 个数组作为函数的输入
数组 1:acct_num、工资等
数组 2:
{1011,'Unit 102, 100 Wester highway, Paramataa'}
{1012,'+61426999888'}
在上面的示例中,数组 2 可以是动态的,这意味着它们最多可以传递 500 个键
如何处理每个数组键和值,因为我需要将地址信息存储在地址 table 和 phone 数字中 PHONE table.
我需要帮助来访问数组中的每个元素,但我不知道如何处理数组 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(, 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']]);
下面的函数展示了访问多维数组的几种方法。一个只是使用切片遍历数组,这是最简单的方法 - c
变量只是存在所以我可以打印 "outer" 索引,这根本没有必要。
另一种方式是直接访问值。但是我不知道如何通过索引访问获取每个 "subarray" 本身 - 例如ar[2:2]
returns {{values}}
、(ar[2:2])[1]
returns NULL,以及 (ar[2:2])[1][1]
returns 子数组中该索引处的项的值- 中间那个返回 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
我需要传递 2 个数组作为函数的输入
数组 1:acct_num、工资等
数组 2: {1011,'Unit 102, 100 Wester highway, Paramataa'} {1012,'+61426999888'}
在上面的示例中,数组 2 可以是动态的,这意味着它们最多可以传递 500 个键 如何处理每个数组键和值,因为我需要将地址信息存储在地址 table 和 phone 数字中 PHONE table.
我需要帮助来访问数组中的每个元素,但我不知道如何处理数组 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(, 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']]);
下面的函数展示了访问多维数组的几种方法。一个只是使用切片遍历数组,这是最简单的方法 - c
变量只是存在所以我可以打印 "outer" 索引,这根本没有必要。
另一种方式是直接访问值。但是我不知道如何通过索引访问获取每个 "subarray" 本身 - 例如ar[2:2]
returns {{values}}
、(ar[2:2])[1]
returns NULL,以及 (ar[2:2])[1][1]
returns 子数组中该索引处的项的值- 中间那个返回 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