我需要从动态表中访问动态字段,并且我有此代码进行此操作
这里f_field以动态t_table获取列的名称。
当将t_table声明为记录时,此代码会出现错误。但是,当声明为静态列fieldType时,它会按预期运行。
问题是,我该如何声明t_row以使该代码正确运行,或者如何以其他方式实现相同的操作。请记住,t_table和f_field是动态的,因此它们的值会改变。
FOR t_row IN EXECUTE 'SELECT * from ' || t_table loop
EXECUTE format('select $1.%I', f_field) USING t_row into f;
RAISE notice '%', f;
END LOOP;
如果我正确地完成了任务,那么您不需要$1
和USING
,例如:
do
$$
declare
t_table text;
f text;
f_field text := 'oid';
r record;
begin
for r in (select relname from pg_class where relname = 'pg_database') loop
EXECUTE format('select %I from %I', f_field, r.relname) into f;
RAISE notice '%', f;
end loop;
end;
$$
;
介意它仅在许多方式中提出第一行
NOTICE: 12669
DO
当我进行研究时,我发现诸如执行的句子……不了解记录结构,这是通过对PLPGSQL进行实验,因为没有关于此的文档。因此,我需要将T_row转换为具有从动态字段提取值的另一种方法,我选择JSON,因为我认为它易于使用。这是我的代码。
FOR t_row IN EXECUTE 'SELECT * from dd.a' loop
f_json := row_to_json(layer_row);
f := json_extract_path(f_json, f_field);
RAISE notice '%', f;
END LOOP;
它对我来说很好,但这只是一个步行,如果有人可以指出为什么我的第一个代码不起作用,我会重新调整它。预先感谢