关于oracle数据库id重置存储

这个博客介绍了如何使用Oracle存储过程P_ResetObjectID来重置指定表的Object ID。首先通过查询SDE.table_registry获取表的registration_id,然后清除arcgis缓存管道,更新表的oid为rownum,接着根据最大oid创建新的序列,并设置公共权限。这个过程对于维护数据库的oid顺序非常有用。
摘要由CSDN通过智能技术生成

–创建该存储,创建完成之后进行存储测试

在这里插入图片描述
右键该存储,Test测试

在这里插入图片描述输入参数 owner 用户 tableName 需要重置的表名 然后运行。就会重新排列该表的id值。

以下是存储内容:

create or replace procedure P_ResetObjectID(owner in NVARCHAR2, tablename in NVARCHAR2)
is

reg_id         pls_integer;
owner_l        VARCHAR2(64);
table_l        VARCHAR2(64);
pipe_name         VARCHAR2(30);
max_id           NUMBER;
stmt           varchar2(512);
sequence_name     VARCHAR2(64);
begin
    owner_l := UPPER(owner);
    table_l := UPPER(tablename);

    stmt := 'SELECT registration_id FROM SDE.table_registry '||
            'WHERE owner ='''|| owner_l ||''' AND table_name = '''|| table_l ||'''';
    EXECUTE IMMEDIATE stmt INTO  reg_id;
    if reg_id is null then return;
    end if;
    pipe_name := 'ArcSDE_IdPipe' || TO_CHAR (reg_id);
    --清除arcgis缓存管道
    stmt := 'select sys.dbms_pipe.remove_pipe('''||pipe_name||''') from dual ';
    EXECUTE IMMEDIATE stmt;
    --更新oid
    stmt := 'update '||table_l||' set objectid=rownum ';
    EXECUTE IMMEDIATE stmt;
    --获取最大oid
    stmt := 'select max(objectid)  from '||table_l;
    EXECUTE IMMEDIATE stmt INTO  max_id;
    if max_id is NULL then return;
    end if;
    --修改序列的当前值
    sequence_name := 'R' || TO_CHAR (reg_id);
    stmt := 'drop  sequence '||sequence_name||' ';
    EXECUTE IMMEDIATE stmt;
    stmt := 'create sequence '||sequence_name||' minvalue 1 maxvalue 2147483647 start with '||max_id||' increment by 16 cache 20';
    EXECUTE IMMEDIATE stmt;
    stmt := 'grant select on '||owner_l||'.'||sequence_name||' to public';
    EXECUTE IMMEDIATE stmt;
end P_ResetObjectID;

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值