ERROR架构不存在

问题描述 投票:1回答:1
CREATE OR REPLACE FUNCTION analyzeTables()
  RETURNS INT AS $$
DECLARE
  v_rec information_schema.tables%ROWTYPE;
BEGIN
  FOR v_rec IN
  SELECT *
  FROM information_schema.tables mytable
  WHERE mytable.TABLE_SCHEMA = 'public'
        AND mytable.table_type = 'BASE TABLE'
  ORDER BY mytable.table_name
  LOOP
    ANALYZE v_rec.table_name;
  END LOOP;
  RETURN 0;
END;
$$
LANGUAGE plpgsql;

SELECT * FROM analyzeTables();

ERROR模式中的结果“v_rec”不存在SQL语句"ANALYZE v_rec.table_name"。正如您所看到的,我正在尝试分析函数中的某些表,并且它没有正确解释v_rec,当我尝试返回表名时,我认为它是模式名称,我想分析i.e ANALYZE fuel_station。已尝试使用和不使用mytable别名并使用%ROWTYPERECORD声明没有区别相同的错误。我究竟做错了什么?

postgresql function plpgsql
1个回答
0
投票

尝试动态sql:

CREATE OR REPLACE FUNCTION analyzeTables()
  RETURNS INT AS $$
DECLARE
  v_rec information_schema.tables%ROWTYPE;
BEGIN
  FOR v_rec IN
  SELECT *
  FROM information_schema.tables mytable
  WHERE mytable.TABLE_SCHEMA = 'public'
        AND mytable.table_type = 'BASE TABLE'
  ORDER BY mytable.table_name
  LOOP
    execute format('ANALYZE %I',v_rec.table_name);
  END LOOP;
  RETURN 0;
END;
$$
LANGUAGE plpgsql;

SELECT * FROM analyzeTables();

使用format

© www.soinside.com 2019 - 2024. All rights reserved.