我们有带有日期字段的表名称,比如table_name_yyyy_mm_dd。想要分析超过两天的表使用过程,并提出以下过程。但是看起来像是带有not like表达式的select命令并没有挑选超过两天的表,而是挑选了所有的表。我做错了什么。请提个建议。
DO $$
DECLARE
tab RECORD;
schemaNa VARCHAR := 'test';
_now_date varchar := TO_CHAR((NOW()-2) :: DATE, 'yyyy_mm_dd') ;
BEGIN
for tab in (select relname AS table_name from pg_stat_user_tables where schemaname='test' and relname not like '%_now_date%' order by 1)
LOOP
RAISE NOTICE 'ANALYZE %1.%2', schemaNa, tab.table_name;
RAISE NOTICE '%',_now_date;
EXECUTE 'ANALYZE '||schemaNa||'.'||tab.table_name;
end loop;
end
$$;
发布于 2020-09-02 15:25:42
不要用单引号将变量名括起来。在生成动态SQL时,最好使用format()
DO $$
DECLARE
tab RECORD;
l_schema VARCHAR := 'test';
l_sql text;
_now_date varchar := TO_CHAR(current_date - 2, 'yyyy_mm_dd');
BEGIN
for tab in (select relname AS table_name
from pg_stat_user_tables
where schemaname = l_schema
and relname not like '%'||_now_date||'%'
order by 1)
LOOP
l_sql := format('ANALYZE %I.%I', l_schema, tab.table_name);
RAISE NOTICE '%', l_sql;
RAISE NOTICE '%',_now_date;
EXECUTE l_sql;
end loop;
end
$$;
https://stackoverflow.com/questions/63708445
复制相似问题