虚谷中使用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语句过程中可能出现的任何错误。这种异常处理方式相对简单,只是提示用户单独检查有问题的语句。

相关推荐
魔法自动机5 分钟前
QT| QT配置CUDA
开发语言·数据库·qt
UntifA1 小时前
实用SQL小总结
sql
snpgroupcn1 小时前
深入了解SAP物料类型是什么?
运维·数据库
2401_854391082 小时前
Spring Boot影院管理系统:小徐的创新
服务器·数据库·spring boot
promise5242 小时前
MySQL实现按分秒统计数据量
linux·运维·数据库·sql·mysql·shell
忽晚♪‎( ᷇࿀ ᷆ و(و2 小时前
Redis
数据库·redis·缓存
golove6662 小时前
分布式数据库
数据库
听雪楼主.2 小时前
某客户Oracle RAC无法启动故障快速解决
数据库·oracle
PGCCC3 小时前
【PGCCC】PostgreSQL中的超级监控助手:pg_stat_monitor,您数据库的最佳搭档!
数据库·postgresql