• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Oracle使用游标为所有用户表创建主键语句

mysql 搞代码 4年前 (2022-01-09) 15次浏览 已收录 0个评论

数据表新增自增一主键能加快数据表的访问速度,而且是整形的索引速度最快。本程序适合在导入Oracle数据库时删除不存在主键的情况

应用场合:数据表新增自增一主键能加快数据表的访问速度,而且是整形的索引速度最快。本程序适合在导入Oracle数据库时删除不存在主键的情况下运行。

代码说明:所有的表主键字段名都设置为ID,如果已存在ID字段,则判断是否是整形,如果不是就重命名字段为[表名ID],然后新增ID,,如果不存在则直接添加自增一ID的主键

操作说明:打开PQSQL连接数据库后直接执行下面的详细脚本代码运行即可,脚本有风险(会删除原来的索引跟主键约束),请不要轻易在正式运行的数据库上直接执行

–Oracle使用游标为所有用户表创建主键语句
–参考语句如下:
–查询所有主键约束select * from user_constraints
–查询所有序列select * from user_sequences;
–查询所有触发器select * from user_triggers;
–查询触发器的用户select distinct(table_owner) from user_triggers;

declare

addstring NVARCHAR2(2000):=’ ‘; –定义添加字段变量
renamestring NVARCHAR2(2000):=’ ‘; –定义重命名字段变量
tablestring NVARCHAR2(2000):=’ ‘; –定义序列变量
keyidname NVARCHAR2(255):=’ID’; –定义主键字段名变量
tableidname NVARCHAR2(255):=’ ‘; –定义新的字段名变量
trigerstring NVARCHAR2(2000):=’ ‘; –定义创建触发器字符串变量
trgname NVARCHAR2(255):=’ ‘; –定义触发器名称变量
seqstring NVARCHAR2(2000):=’ ‘; –定义创建序列字符串变量
seqname NVARCHAR2(255):=’ ‘; –定义序列名称变量
pkname NVARCHAR2(255):=’ ‘; –定义主键索引名称变量

constring NVARCHAR2(2000):=’ ‘; –定义索引变量
notnullstring NVARCHAR2(2000):=’ ‘; –定义主键不为空变量

cursor mycursor is select * from user_tables where TABLESPACE_NAME=’SZGABL’ ORDER BY TABLE_NAME; –定义游标获取所所有用户数据表名称
myrecord mycursor%rowtype; –定义游标记录类型
CounterName int :=0; –定义是否存在对应的列名变量
CounterData int :=0; –定义是否存在对应的数据类型

begin

dbms_output.put_line(‘declare counter int :=0;begin ‘);

open mycursor; –打开游标
if mycursor%isopen then –判断打开成功
loop –循环获取记录集
fetch mycursor into myrecord; –获取游标中的记录

if mycursor%found then –游标的found属性判断是否有记录
begin
–获取有效的数据表名
select replace(myrecord.TABLE_NAME,’TB_’,”) into tablestring from dual;
select ‘SEQ_’||tablestring into seqname from dual;
select ‘TRG_’||tablestring into trgname from dual;
select ‘PK_’||tablestring into pkname from dual;
select tablestring||UPPER(keyidname) into tableidname from dual;

–判断当前数据表是否包含字段名为ID的列
SELECT COUNT(*) INTO CounterName FROM dual WHERE EXISTS(SELECT * FROM user_tab_cols WHERE LOWER(COLUMN_NAME)=LOWER(keyidname) and TABLE_NAME=myrecord.TABLE_NAME);
if CounterName=0 then
begin
dbms_output.put_line(‘–当前数据表’||myrecord.TABLE_NAME||’不存在字段名为ID的列’);
–添加主键字段
addstring:=’execute immediate ”alter table ‘||myrecord.TABLE_NAME||’ add ‘||keyidname||’ NUMBER”;’;
dbms_output.put_line(addstring);
–execute immediate addstring;

–创建一个序列
seqstring:=’select count(*) into counter from dual where exists(select * from user_s本文来源gaodaimacom搞#代%码@网-equences where sequence_name=”’||seqname||”’);if counter>0 then execute immediate ”drop sequence ‘||seqname||”’; end if; execute immediate ” create sequence SEQ_’||tablestring||’ INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE”;’;
dbms_output.put_line(seqstring);
–execute immediate seqstring;
–创建一个触发器
trigerstring:=’select count(*) into counter from dual where exists(select * from user_triggers where trigger_name=”’||trgname||”’);if counter>0 then execute immediate ”drop trigger ‘||trgname||”’; end if; execute immediate ” create trigger TRG_’||tablestring||’ BEFORE INSERT ON ‘||myrecord.TABLE_NAME||’ FOR EACH ROW WHEN (new.’||keyidname||’ is null) begin select ‘||seqname||’.nextval into: new.’||keyidname||’ from dual; end”;’;
dbms_output.put_line(trigerstring);
–execute immediate trigerstring;
–添加主键约束
constring:=’select count(*) into counter from dual where exists(select * from user_constraints where constraint_name=”’||pkname||”’);if counter>0 then execute immediate ”drop constraint ‘||pkname||”’; end if; execute immediate ”alter table ‘||myrecord.TABLE_NAME||’ add constraint ‘||pkname||’ primary key(‘||keyidname||’)”;’;
dbms_output.put_line(constring);
–execute immediate constring;
–更新主键不为空
notnullstring:=’select count(*) into counter from dual where exists(select * from user_tab_cols where table_name=”’||myrecord.TABLE_NAME||”’ and column_name=”’||keyidname||”’ AND NULLABLE=”Y” );if counter>0 then execute immediate ”alter table ‘||myrecord.TABLE_NAME||’ modify ‘||keyidname||’ not null”; end if;’;
dbms_output.put_line(notnullstring);
–execute immediate notnullstring;
end;
else
begin
–判断当前数据表是否包含字段名为ID且数据类型为NUMBER
SELECT COUNT(*) INTO CounterData FROM dual WHERE EXISTS(SELECT * FROM user_tab_cols WHERE LOWER(COLUMN_NAME)=LOWER(keyidname) AND DATA_TYPE=’NUMBER’ and TABLE_NAME=myrecord.TABLE_NAME);
if CounterData=0 then
begin
dbms_output.put_line(‘–当前数据表’||myrecord.TABLE_NAME||’存在字段名为ID,但数据类型不为NUMBER的列’);
–先重命名字段,然后添加主键字段
renamestring:=’execute immediate ”alter table ‘||myrecord.TABLE_NAME||’ rename column ‘||keyidname||’ to ‘||tableidname||”’;’;
dbms_output.put_line(renamestring);
–execute immediate renamestring;
–添加主键字段
addstring:=’execute immediate ”alter table ‘||myrecord.TABLE_NAME||’ add ‘||keyidname||’ NUMBER”;’;
dbms_output.put_line(addstring);


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Oracle使用游标为所有用户表创建主键语句

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址