如果有人可以指导,如果Postgres允许分配ARRAY记录属性,我们将不胜感激。例如 - 虚拟设置。
尝试更新记录的属性(数组的一部分)。 直接分配不起作用。必须创建一种创建额外记录,分配和交换的迂回方式。
create table dummy_array (id numeric, descr varchar(100));
insert into dummy_array values(1,'TEST1'),(2,'TEST2');
select * from dummy_array;
do
$function$
declare
v_array dummy_array[];
v_dummy_rec dummy_array;
begin
v_array=array(select ROW(id,descr) from dummy_array);
raise notice '%',v_array[1].descr;
--FOLLOWING DIRECT ASSIGNMENT DOES NOT WORK
v_array[1].descr :='ZZZ';--This assignment errors out
end ;
$function$
Errors out with SQL ERROR[42601]:ERROR:syntax error at or near "."
Tried even (v_array[1]).descr :='ZZZ'; does not work
关注Works但是hack创建临时,复制,分配,修改reassing
do
$function$
declare
v_array dummy_array[];
v_dummy_rec dummy_array;
begin
v_array=array(select ROW(id,descr) from dummy_array);
raise notice '%',v_array[1].descr;
**--v_array[1].descr :='ZZZ';--This assignment errors out**
v_dummy_rec :=v_array[1];
v_dummy_rec.descr :='ZZZ';
v_array[1]:=v_dummy_rec;
raise notice '%',v_array[1].descr;
end ;
$function$
如果能够进行如上所示的直接作业,可以指导我吗
**v_array[1].descr :='ZZZ';--This assignment errors out**
答案 0 :(得分:0)
问题是,您的v_array
类型为dummy_array[]
,因此它只接受dummy_array[]
值。
这有效v_array[1] := ROW(1,'ZZZ');
do
$function$
declare
v_array dummy_array[];
v_dummy_rec dummy_array;
begin
v_array=array(select ROW(id,descr) from dummy_array);
raise notice '%',v_array[1].descr;
v_array[1] := ROW(1,'ZZZ');
raise notice '%',v_array[1].descr;
end ;
$function$
回答澄清评论
在PostgreSQL中,可以更新记录的各个属性(see here)。在你的情况下,问题是数组,PostgreSQL失败的地方;因为它似乎在运行代码(PL)时不会将v_array[1]
编译为记录变量,所以它只是将其视为数组元素(因此是错误消息)。这可以修复"使用类型dummy_array
的额外变量而不使用数组;那是你的v_dummy_rec
:
DO $function$
DECLARE
v_array dummy_array[];
v_dummy_rec dummy_array;
BEGIN
v_array=array(select ROW(id,descr) from dummy_array);
raise notice '%',v_array[1].descr;
v_array[1] := ROW(1,'ZZZ');
raise notice '%',v_array[1].descr;
-- Here is the use of v_dummy_rec:
v_dummy_rec := v_array[1];
v_dummy_rec.descr := 'AAA';
v_array[1] := v_dummy_rec;
raise notice '%',v_array[1].descr;
END; $function$
RAISE NOTICE
输出:
NOTICE: TEST1
NOTICE: ZZZ
NOTICE: AAA