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

How to access a record's field in an Execute sentence?

我需要从动态 table 访问动态字段,我有执行此操作的代码

这里 f_field 动态地从 t_table 中获取列的名称。

当 t_table 声明为记录时,此代码会出错。但是当声明为静态列字段类型时,它 运行 符合预期。

问题是,我如何才能将此代码的 t_row 正确地声明为 运行,或者我如何通过其他方式实现相同的目的。请记住 t_table 和 f_field 是动态的,因此它们的值会发生变化。

FOR t_row IN EXECUTE 'SELECT * from ' || t_table loop
    EXECUTE format('select .%I', f_field) USING t_row into f;
    RAISE notice '%', f;
  END LOOP;

如果我做对了你的任务,你根本不需要 </code> 和 <code>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

当我在做研究时,我发现像 EXECUTE... 这样的句子不理解记录结构,这是通过试验 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;  

它对我来说很好用,但这只是一种解决方法,如果有人能指出为什么我的第一个代码不起作用,我将不胜感激。提前致谢