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

相关推荐
zhengfei61119 分钟前
Chroma DB — 未经授权的信息披露
数据库
KaiwuDB40 分钟前
KaiwuDB 获评“2025 中国大数据产业年度国产化优秀代表厂商”
数据库
百***07451 小时前
一步API+Gemini 3.0 Pro进阶实战:多模态开发、性能调优与项目落地
数据库·microsoft
不想写bug呀1 小时前
Redis主从复制介绍
数据库·redis
颜颜yan_1 小时前
Oracle 迁移到 KingbaseES 实战:从评估到追平的一套可落地流程
数据库·oracle
砚边数影1 小时前
Oracle迁移替换实战:金仓数据库如何破解企业数据迁移难题
数据库·oracle·kingbase·kingbasees·数据库平替用金仓·金仓数据库
burning_maple2 小时前
mysql数据库笔记
数据库·笔记·mysql
Navicat中国2 小时前
1月31日·上海 | Navicat 鼎力助阵 OceanBase 年度嘉年华
数据库·oceanbase·navicat
Pocker_Spades_A2 小时前
Oracle向KingbaseES迁移:核心痛点拆解与根源分析
数据库·oracle
被星1砸昏头2 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python