【问题标题】:For loop with dynamic table name in Postgresql 9.1?在 Postgresql 9.1 中使用动态表名进行循环?
【发布时间】:2014-01-24 19:06:46
【问题描述】:

我有一个plpgslq 函数,它进行一些数据处理并想编写一个for 循环,但是我的表名在设计时是未知的。有没有可能的方法来实现这一目标?这是我想要实现的示例代码 sn-p:

-- Function: check_data()

-- DROP FUNCTION check_data();

CREATE OR REPLACE FUNCTION check_data()
  RETURNS character varying AS
$BODY$declare
 dyn_rec record;
 tbl_name record;
begin
  -- sample dynamic tables
  tbl_name := 'cars';
  tbl_name := 'trucks';
  tbl_name := 'bicycles';

  for dyn_rec in select * from format($$s%$$,tbl_name) loop
    raise notice 'item is %',dyn_rec.item_no;
  end loop;

  return 'Processing Ok';

end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION check_data()
  OWNER TO postgres;

【问题讨论】:

    标签: postgresql dynamic-sql


    【解决方案1】:

    您永远不能在 plpgsql 嵌入式 SQL 中将变量用作表或列标识符。一个解决方案是动态 SQL - EXECUTE 或 FOR IN EXECUTE 语句:

    DO $$
    DECLARE
      tables text[] = ARRAY['table1','table2'];
      table_name text;
      rec record;
    BEGIN
      FOREACH table_name IN ARRAY tables
      LOOP
        FOR r IN EXECUTE format('SELECT * FROM %I', table_name)
        LOOP
          RAISE NOTICE '%', rec;
        END LOOP; 
      END LOOP;
    END; $$
    

    【讨论】:

    • 感谢 Pavel Stehule,“执行”正是我所需要的,现在可以正常工作了。
    • arcull,也许你应该把它标记为答案,如果它有效的话。 :)
    猜你喜欢
    • 2021-09-08
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多