【发布时间】:2014-05-15 12:48:43
【问题描述】:
我有这段代码:
RAISE NOTICE 'p_new_roster: %', p_new_roster; --prints {3,4,5}
FOREACH i IN ARRAY p_new_roster
LOOP
RAISE NOTICE 'p_new_roster[i]: %', p_new_roster[i]; --prints 5,NULL,NULL (through 3 iterations)
v_new_users := v_new_users || p_new_roster[i];
END LOOP;
为什么 p_new_roster[1] 是 5,p_new_roster[2] 是 NULL 等等?变量 i 被声明为整数,数组被声明为 integer[]。
基本上我要做的是克隆“p_new_roster”数组。如果有人知道更好的方法,我也想知道如何。
【问题讨论】:
-
PostgreSQL 数组是不可变的。为什么要“克隆”它?只是
v_new_users = p_new_roster。你试图通过这样做来解决的实际问题是什么,你在这里问的“如何”的“为什么”? -
我有两个数组:arr1 = {1,2,3} 和 arr2 = {3,4,5}(这只是示例)。我需要比较这两个数组并在一列 {1,2} 和第二列 {4,5} 中返回的函数(我会将结果放在复合类型中)。
-
如果我做 v_new_users := p_new_roster 那么我对 v_new_users 所做的更改也会出现在 p_new_roster 中吗?我需要 p_new_roster 供以后使用。
-
@anagarD 不。您将 p_new 的值分配给 v_new 而不是对 p_new 的引用
-
不,您完全误解了数组在 PostgreSQL 中的工作方式。它们是不可变的。它不像Java那样分配数组只是分配引用。整个数组被复制。它就像 Java 中的字符串。您不能通过设置属性就地修改数组。
标签: arrays postgresql stored-procedures