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别名并使用%ROWTYPE
和RECORD
声明没有区别相同的错误。我究竟做错了什么?
尝试动态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