虚谷中使用PL/SQL改变模式下所有表的大小写

一、将表名转换为小写

1、原理和思路

首先,我们需要查询出指定模式下的所有表名,在xugu中,数据字典dba_tables包含了当前库下的所有表信息,我们可以使用游标(CURSOR)来遍历这些表名。

2、代码示例如下:

sql 复制代码
declare
--定义游标
 cursor cur is 
  select table_name from dba_tables where schema_id = (select schema_id from dba_schemas where schema_name = 'TRIPARTITE-DATA');
 tab_name varchar;
 schema_name VARCHAR;
 datemark VARCHAR;
BEGIN
 schema_name := 'SCHEMA_NAME';
 datemark := to_char(sysdate,'yyyymmdd')||'_bak';
--打开游标
 if not cur%isopen then open cur;
 end if;
--从游标获取表名
 fetch cur into tab_name;
 while cur%found loop
--执行重命名操作
  send_msg('alter table '||'"'||schema_name||'"'||'.'||tab_name||' rename to '||'"'||lower(tab_name)||'_'||datemark||'"'||';');
  send_msg('alter table '||'"'||schema_name||'"'||'.'||'"'||lower(tab_name)||'_'||datemark||'"'||' rename to '||'"'||lower(tab_name)||'"'||';');
  fetch cur into tab_name;
 end loop;
--输出表的数量
 send_msg('共'||cur%rowcount||'张表');
--关闭游标
end;

在这个示例中:

我们首先定义了一个游标cur ,它从dba_tables里获取表名。

在循环中,对于每个获取到的表名tab_name,使用lower函数将其转换成小写形式

二、将表名转换为大写

1、原理和思路

方式一:与转换小写类似,同样是查询出表名,然后构建动态SQL进行重命名操作,只是使用upper函数来转换大写。

方式二:使用FOR-IN循环的方式

代码示例:

方式二:

sql 复制代码
DECLARE
tab varchar;
sql varchar;
sql1 varchar;
begin
for i in (select s.schema_name,t.table_name from dba_tables t,dba_schemas s where t.schema_id=s.schema_id and schema_name='schema_name') loop 
 begin
  select upper(i.table_name) into tab;
  sql:='alter table '| i.schema_name |'."'|i.table_name |'" rename to "' |tab |'111111111";';
  send_msg(sql);
  execute immediate SQL;
  sql1:='alter table '| i.schema_name |'."'|tab |'111111111' |'" rename to "' | tab |'";';
  send_msg(sql1);
  execute immediate sql1;
  EXCEPTION WHEN OTHERS THEN send_msg('上面这个语句有问题!请单独执行查看错误!');
 END;
end loop;
END

在这个示例中使用FOR - IN循环直接遍历由dba_tables和dba_schemas关联查询得到的结果集。关联查询通过WHERE子句筛选出特定模式(这里是名为schema_name的模式)下的表名及其所属的模式名。

表名转换与重命名操作,在循环内部,对于每个表,首先使用SELECT UPPER(i.table_name) INTO tab FROM dual;将表名转换为大写形式并存储到变量tab中。

然后构建两个动态的ALTER TABLE语句。第一个语句sql := 'alter table ' || i.schema_name || '."' || i.table_name || '" rename to "' || tab || '111111111";';将原始表名重命名为大写形式并添加一个特定的后缀(这里是111111111)。这可能是为了避免直接修改表名时可能出现的一些冲突或依赖问题。接着通过send_msg(sql);发送这个SQL语句(假设send_msg是用于记录日志或显示操作的自定义过程),并使用EXECUTE IMMEDIATE sql;执行该语句。

第二个语句sql1 := 'alter table ' || i.schema_name || '."' || tab || '111111111' || '" rename to "' || tab || '";';将带有后缀的表名再重命名为纯粹的大写表名,同样先发送再执行。

异常处理,在内部的BEGIN - END块中,使用EXCEPTION WHEN OTHERS THEN send_msg('上面这个语句有问题!请单独执行查看错误!');来捕获在执行动态SQL语句过程中可能出现的任何错误。这种异常处理方式相对简单,只是提示用户单独检查有问题的语句。

相关推荐
众链网络7 分钟前
Agent 重试的工程解法:幂等、断点续跑与熔断怎么落地
java·前端·数据库·人工智能
oradh17 分钟前
Oracle 索引维护操作总结
数据库·oracle
for_ever_love__18 分钟前
MySQL Online DDL 完全指南:INSTANT/INPLACE/COPY 三种算法、MDL 锁事故与 gh-ost 实战
数据库·mysql·ddl·online·gh-ost·锁表·加字段
for_ever_love__29 分钟前
MySQL 子查询、派生表与 CTE 优化:半连接、物化和递归实战
数据库·mysql·优化·as·子查询·with·cte
DBA_G1 小时前
GBase 8c分布式数据库客户端工具 gsql
数据库·分布式
用户5611610232731 小时前
量化笔记程序代码分析,逐笔数据、五档快照和分钟行情代码分析
数据库
房开民1 小时前
通俗总结 Octree(八叉树)
java·服务器·数据库
星云低代码开发平台1 小时前
AI 连接器运行健康度:指标、异常恢复和联调清单
大数据·运维·网络·数据库·人工智能·mcp
鱼宵2 小时前
LangChain4j 生产化改造:记忆落 Redis、向量落 ES,重启再也不丢
数据库·redis·elasticsearch·langchain4j
星云API技术笔记2 小时前
企业微信外部群机器人实战:多人同时咨询时,如何准确匹配消息与回复对象
数据库