如何访问执行句子中的记录字段?



我需要从动态表中访问动态字段,并且我有此代码进行此操作

这里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;

如果我正确地完成了任务,那么您不需要$1USING,例如:

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;  

它对我来说很好,但这只是一个步行,如果有人可以指出为什么我的第一个代码不起作用,我会重新调整它。预先感谢

最新更新