【PostgreSQL】pgsql编写函数实现批量删除数字结尾的备份表
执行前:

最终代码:
CREATE OR REPLACE FUNCTION "ap"."iter_drop_table_bak"() RETURNS "pg_catalog"."void" AS $BODY$ DECLARE row_tag VARCHAR(200); BEGIN FOR row_tag IN ( select tablename from pg_tables where schemaname='ap' and tablename SIMILAR TO 'analysis_[a-z,_]+_[0-9]+' ) LOOP RAISE notice '表名为:%',row_tag; EXECUTE concat('drop table ',row_tag); END LOOP; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100
-- 删除备份表
-- 〇、概述
1、所需库表
库:雪蕾DEV
模式:ap中生成的分析模型
表:analysis_automodelaiyp_202207201611
2、所需函数
case when then end
REGEXP_LIKE(String, Regexp)
3、步骤
(1)获得指定库模式下的所有表,并建立临时表
(2)查找临时表的内容
(3)选用合适的正则表达式匹配函数
(4)使用CASE WHEN,删除表
4、所需资料
(1)查看数据库的所有表
http://www.viiis.cn/news/show_93227.html
(2)SQL正则表达式及案例
https://zhuanlan.zhihu.com/p/352635770
(3)创建临时表
http://t.zoukankan.com/lhdz_bj-p-9024183.html
(4)腾讯pgsql模式匹配文档
https://cloud.tencent.com/document/product/878/33579
(5)pgsql存储过程
一、分步骤实施
0、测试
case 
when  REGEXP_LIKE(table_name, "^[A-Z]+_[a-z0-9]+$")
then 
	drop table_name
else
	continue
end
1、获得指定库模式下的所有表,并建立临时表
(1)查询所有表
select * from pg_tables; -- 查询当前数据库的所有表 
-- 字段schemaname/tablename
(2)筛选出指定模式的所有表
select tablename
from pg_tables
where schemaname='ap';
(3)使用原生语法查询【需要在pgadmin查询】
\d
(4)建立临时表
create temp table delete_table_list_all(tablename varchar(255));
(5)向临时表中插入数据
insert into delete_table_list_all(tablename)
select tablename
from pg_tables
where schemaname='ap';
(6)查询临时表的数据
select * from delete_table_list_all;
(7)最终效果
create temp table delete_table_list_all(tablename varchar(255)); -- 建临时表
insert into delete_table_list_all(tablename) -- 插入数据
select tablename
from pg_tables
where schemaname='ap';
select * from delete_table_list_all; -- 查询临时表所有数据
2、选用合适的正则表达式匹配函数
方式:SIMILAR TO 或 ~ 或 LIKE
(1)查询出指定表名(使用LIKE)
select tablename
from pg_tables
where 
		schemaname='ap'
		and
		tablename LIKE 'a%';
(2)使用SIMILAR TO -- OKAY
select tablename
from pg_tables
where 
		schemaname='ap'
		and
		tablename SIMILAR TO 'analysis_[a-z]+_[0-9]+';
(3)使用regexp/~/POSIX正则表达式
(4)最终SIMILAR TO
select tablename
from pg_tables
where 
		schemaname='ap'
		and
		tablename SIMILAR TO 'analysis_[a-z]+_[0-9]+';
4、通过创建函数或存储过程,删除查到的所有表
(1)测试创建存储过程
-- 循环(mysql)
create or replace procedure p_xunhuan(input in number,output out number) as
temp number(10);
begin
       temp := 0;
       
       for temp in 0..input loop
           begin
                output := input+temp;
                dbms_output.put_line('----'||output);
           end;
       end loop;
       
end p_xunhuan;
-- 执行存储过程(mysql)
declare 
     sr number;
     sc number;
begin
     sr := 7;
     p_xunhuan(sr,sc);
end;
-- 创建存储过程(pgsql)
CREATE OR REPLACE FUNCTION learn_conditional01(IN num integer,OUT result_str varchar(20)) AS
$BODY$
BEGIN
   IF num <= 0 THEN
     result_str = '小于等于0';
   ELSIF num <= 100 THEN
     result_str = '(0-100]';
   ELSIF num <= 1000 THEN
     result_str = '(100-1000]';
   ELSE 
     result_str = '1000以上';
   END IF;
END;
$BODY$
LANGUAGE plpgsql;
-- 执行存储过程
select learn_conditional01(-1);
-- 存储过程循环
-- IN可以跟子查询
CREATE OR REPLACE FUNCTION learn_conditional06()
RETURNS Void AS
$BODY$
DECLARE counter integer = 1;
BEGIN
    RAISE notice '--------------';
	FOR i IN 1..10 LOOP  
        RAISE notice '这是第%次循环',i;
	END LOOP;
	RAISE notice '--------------';
	FOR i IN REVERSE 10..1 LOOP
        RAISE notice '这是倒序的第%次循环',i;
	END LOOP;
	RAISE notice '--------------';
	FOR i IN 1..10 BY 3 LOOP  --间隔2个数字
        RAISE notice '这是间隔2个数的第%次循环',i;
	END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
-- 循环执行
select learn_conditional06();
(2)创建存储过程,遍历数据
CREATE OR REPLACE FUNCTION iter_drop_table_bak()
RETURNS Void AS
$BODY$
DECLARE 
		row_tag VARCHAR(200); 
		table_name VARCHAR(200);
BEGIN
		FOR row_tag IN (
						select 
								tablename
						from pg_tables
						where 
								schemaname='ap'
								and
								tablename SIMILAR TO 'analysis_[a-z,_]+_[0-9]+'
		) LOOP
					RAISE notice '表名为:%',row_tag;
					EXECUTE concat('drop table ',row_tag);
			END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
-- 执行
select iter_drop_table_bak();
(3)执行删除操作
set a = btrim('(123)','()');
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/16501824.html
                    
                
                
            
        
浙公网安备 33010602011771号