Postgres plpgsql - ARRAY 记录属性赋值
Postgres plpgsql - ARRAY record attribute asssignment
如果有人可以指导 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
以下作品,但黑客创建临时、复制、分配、修改重新评估
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**
问题是您的 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]
编译为记录变量,它只是将其视为数组元素(因此出现错误消息)。这可以是 "fixed" 使用一个没有数组的 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
如果有人可以指导 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
以下作品,但黑客创建临时、复制、分配、修改重新评估
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**
问题是您的 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]
编译为记录变量,它只是将其视为数组元素(因此出现错误消息)。这可以是 "fixed" 使用一个没有数组的 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