阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle完全复制表结构的存储过程

439次阅读
没有评论

共计 4874 个字符,预计需要花费 13 分钟才能阅读完成。

最近在处理一个 Oracle 分表的问题时,需要为程序创建一个自动分表的存储过程,需要保证所有表结构,约束,索引等等一致,此外视图,存储过程,权限等等问题暂不用考虑。

在 MySQL 中,创建分表的存储过程,相当简单:create table if not exists <new_table_name> like <old_table_name>; 即可,约束,索引一应俱全。

但是在 Oracle 中貌似没有,所以只能自己写,需要考虑的情况比较多,脚本如下:

CREATE OR REPLACE PROCEDURE CREATETABLE(tableName in varchar2,
                                        dateStr  in varchar2)
  AUTHID CURRENT_USER as
  newTable varchar2(32) := tableName || ‘_’ || dateStr;
 
  v_create_table_sql clob;
  –c1,默认值游标
  v_add_default_sql clob;
  cursor default_cols is
    select COLUMN_NAME, DATA_DEFAULT
      from user_tab_columns
    where DATA_DEFAULT is not null
      and TABLE_NAME = tableName;
  –c2 主键的 not null 不会继承,但 not null 约束的会继承, 因此 c2 全部注释
  /*v_add_notnull_sql clob;
  cursor notnull_cols is select COLUMN_NAME from user_tab_columns t where t.NULLABLE=’N’ and  and t.TABLE_NAME=tableName;*/
  –c3,主键游标,虽然主键只能有一个,但为统一起见还是用了游标
  v_add_primary_sql clob;
  cursor primary_cols is
    select distinct tmp.TABLE_NAME,
                    tmp.INDEX_NAME,
                    to_char(wm_concat(tmp.COLUMN_NAME)
                            over(partition by tmp.TABLE_NAME)) as pri_cols
      from (select i.TABLE_NAME,
                  i.INDEX_NAME,
                  i.COLUMN_NAME,
                  i.COLUMN_POSITION
              from user_ind_columns i
              join user_constraints c
                on i.INDEX_NAME = c.index_name
            where c.CONSTRAINT_TYPE = ‘P’
              and i.TABLE_NAME = tableName
            order by 1, 2, 4) tmp;
  –c4,唯一约束游标
  v_add_unique_sql clob;
  cursor unique_cons is
    select distinct tmp.TABLE_NAME,
                    tmp.INDEX_NAME,
                    to_char(wm_concat(tmp.COLUMN_NAME)
                            over(partition by tmp.TABLE_NAME,
                                tmp.INDEX_NAME)) as uni_cols,
                    replace(to_char(wm_concat(tmp.COLUMN_NAME)
                                    over(partition by tmp.INDEX_NAME)),
                            ‘,’,
                            ‘_’) as new_indexname
      from (select i.TABLE_NAME,
                  i.INDEX_NAME,
                  i.COLUMN_NAME,
                  i.COLUMN_POSITION
              from user_ind_columns i
              join user_constraints c
                on i.INDEX_NAME = c.index_name
            where c.CONSTRAINT_TYPE = ‘U’
              and i.TABLE_NAME = tableName
            order by 1, 2, 4) tmp;
  –c5,非唯一非主键索引游标
  v_create_index_sql clob;
  cursor normal_indexes is
    select distinct tmp.TABLE_NAME,
                    tmp.INDEX_NAME,
                    to_char(wm_concat(tmp.COLUMN_NAME)
                            over(partition by tmp.TABLE_NAME,
                                tmp.INDEX_NAME)) as index_cols
      from (select i.TABLE_NAME,
                  i.INDEX_NAME,
                  c.COLUMN_NAME,
                  c.COLUMN_POSITION
              from user_indexes i
              join user_ind_columns c
                on i.INDEX_NAME = c.INDEX_NAME
            where index_type = ‘NORMAL’
              and i.TABLE_NAME = tableName
              and i.uniqueness = ‘NONUNIQUE’
            order by 1, 2, 4) tmp;
  –c6,不是由唯一约束生成的唯一索引游标
  v_create_unique_index_sql clob;
  cursor unique_cols is
    select distinct tmp.TABLE_NAME,
                    tmp.INDEX_NAME,
                    to_char(wm_concat(tmp.COLUMN_NAME)
                            over(partition by tmp.TABLE_NAME,
                                tmp.INDEX_NAME)) as index_cols
      from (select u_i.TABLE_NAME,
                  u_i.INDEX_NAME,
                  c.COLUMN_NAME,
                  c.COLUMN_POSITION
              from (select *
                      from user_indexes
                    where table_name = tableName
                      and index_type = ‘NORMAL’
                      and index_name not in
                          (select index_name
                              from user_constraints
                            where table_name = tableName
                              and index_name is not null)) u_i
              join user_ind_columns c
                on u_i.INDEX_NAME = c.INDEX_NAME
            where u_i.TABLE_NAME = tableName
              and u_i.uniqueness = ‘UNIQUE’
            order by 1, 2, 4) tmp;
begin
  – 创建表结构
  v_create_table_sql := ‘create table ‘ || newTable || ‘ as select * from ‘ ||
                        tableName || ‘ where 1=2’;
  execute immediate v_create_table_sql;
  – 添加默认值
  for c1 in default_cols loop
    v_add_default_sql := ‘alter table ‘ || newTable || ‘ modify ‘ ||
                        c1.column_name || ‘ default ‘ || c1.DATA_DEFAULT;
    execute immediate v_add_default_sql;
  end loop;
  – 添加非空约束
  /*  for c2 in notnull_cols loop
    v_add_notnull_sql:=’alter table ‘||newTable||’ modify ‘||c2.column_name||’ not null’;
    execute immediate v_add_notnull_sql;
  end loop;*/
  – 添加主键约束
  for c3 in primary_cols loop
    v_add_primary_sql := ‘alter table ‘ || newTable ||
                        ‘ add constraint Pk_’ || newTable ||
                        ‘ primary key(‘ || c3.pri_cols || ‘)’;
    execute immediate v_add_primary_sql;
  end loop;
  – 添加唯一性约束,由于原约束名可能由于创建约束的方法不同,存在系统自定义的名字,因此这里直接命名唯一约束
  for c4 in unique_cons loop
    v_add_unique_sql := ‘alter table ‘ || newTable || ‘ add constraint U_’ ||
                        c4.new_indexname || ‘ unique(‘ || c4.uni_cols || ‘)’;
    execute immediate v_add_unique_sql;
  end loop;
  – 创建非主键且非唯一的索引,索引名字直接继承自主表,后缀 dateStr 以示不同
  for c5 in normal_indexes loop
    v_create_index_sql := ‘create index ‘ || c5.index_name || ‘_’ ||
                          dateStr || ‘ on ‘ || newTable || ‘(‘ ||
                          c5.index_cols || ‘)’;
    execute immediate v_create_index_sql;
  end loop;
  – 创建不是由于约束生成的唯一索引
  for c6 in unique_cols loop
    v_create_unique_index_sql := ‘create unique index ‘ || c6.index_name || ‘_’ ||
                                dateStr || ‘ on ‘ || newTable || ‘(‘ ||
                                c6.index_cols || ‘)’;
    execute immediate v_create_unique_index_sql;
  end loop;
end createTable;
 
/

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2018-01/150185.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4874字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7805121
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示 首先来回顾一下 10...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...