执行前:

最终代码:

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)','()');

【PostgreSQL】pgsql编写函数实现批量删除数字结尾的备份表的更多相关文章

  1. mysql批量删除指定前缀或后缀表

    今天突然发现我们数据库中多出很多表,后缀名为"copy",预计是navicat直接拷贝导致的,然后要对这些有同样后缀名的表进行删除,假设一个一个选择会非常麻烦,表计较多,在网上找了 ...

  2. oracle批量删除某用户下的表

    昨天干了一天的体力活,到快下班时被要求删除一批测试库上错误的表,主要是这些表的字段和生产上字段顺序对不上,然后让我写个脚本,让dba执行一下,主要是删表这种东西我们都没权限. 然后,我就被难到了,我记 ...

  3. Greenplum(PostgreSql)函数实现批量删除表

    项目做库迁移,前期需要经常调整表结构语句,涉及多次的批量drop,本着偷懒精神写了这个函数.鉴于本函数在生产环境有巨大风险,建议测试完毕后立即删除. 主要步骤很简单:1)从pg_tables查询得到相 ...

  4. sqlserver 批量删除相同前缀名的表

    ) DECLARE tmpCur CURSOR FOR SELECT name FROM sys.objects WHERE TYPE='U' AND name LIKE N'HSUPA%' OPEN ...

  5. python 批量删除mysql前缀相同的表

    1,一般游戏log数据库会存储大量的玩家行为日志,一种行为一张表,每天生成一张新表,一天会有30+张不同行为的表,通常会保留玩家日志1年左右,对于超过1年的日志需要删除 2,log数据库一年会保存1W ...

  6. mssql批量删除数据库里所有的表

    go declare @tbname varchar(250) declare #tb cursor for select name from sysobjects where objectprope ...

  7. SQL删除语句同时向备份表插入数据

    从这里摘抄下来的,觉得很不错,http://www.cnblogs.com/ljhdo/p/5792886.html#3503524 ,以后就用这种方式删除,再也不用担心删除错数据啦!!!

  8. PHP数据访问批量删除(10261101)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. sqlserver中自定义函数+存储过程实现批量删除

    由于项目的需要,很多模块都要实现批量删除的功能.为了方便模块的调用,把批量删除方法写成自定义函数.直接上代码. 自定义函数: ALTER FUNCTION [dbo].[func_SplitById] ...

  10. postgresql批量删除表

    CREATE FUNCTION del_ora_table() RETURNS void AS $$ DECLARE tmp ); DECLARE names CURSOR FOR select ta ...

随机推荐

  1. 路径参数:Path Parameters

    官方文档地址:https://fastapi.tiangolo.com/zh/tutorial/path-params/ # -*- coding: UTF-8 -*- from fastapi im ...

  2. 修改Windows10 命令终端cmd的编码为UTF-8 && IDEA控制台输出中文乱码

    临时修改 进入cmd窗口后,直接执行 chcp 65001 永久修改 在运行中输入regedit,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Pro ...

  3. 01_Typora学习

    Typora学习 使用Typora 编辑器 一. 标题 一个#后加空格表示一级标题(快捷键Ctrl+1) 两个#后加空格表示二级标题(快捷键Ctrl+2) 以此类推,目前最多到六级标题(快捷键Ctrl ...

  4. 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解

    什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...

  5. SQL抽象语法树及改写场景应用

    1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...

  6. 换工作?试试远程工作「GitHub 热点速览 v.22.40」

    近日,潜在某个技术交流群的我发现即将毕业的小伙伴在焦虑实习.校招,刚好本周 GitHub 热榜有个远程工作项目.不妨大家换个思路,"走"出去也许有更多的机会.当然,除了全球的远程工 ...

  7. 路由组件构建方案(分库分表)V1

    路由组件构建方案V1 实现效果:通过注解实现数据分散到不同库不同表的操作. 实现主要以下几部分: 数据源的配置和加载 数据源的动态切换 切点设置以及数据拦截 数据的插入 涉及的知识点: 分库分表相关概 ...

  8. 4.websocket基本概念

    websockey的模式就是在于当前端向后端发送请求创建一个websocket链连接之后,连接默认不断开,前端和服务端就维护了一个连接,前端可以通过连接给服务端发消息,服务端也可以通过连接给前端发消息 ...

  9. settings.py 配置汇总

    数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': ' ', #数据库名称 ...

  10. 十四、资源控制器之RS

    RC (ReplicationController )主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数 .即如果有容器异常退出,会自动创建新的 Pod 来替代:而如果异常多出来的容器也 ...