knightnibo
作者knightnibo2017-05-22 09:51
数据库管理员, 亚博科技

Oracle全局视图替代的思考

字数 1663阅读 692评论 0赞 0

迁移过程中经常遇到某些客户希望通过类似ORACLE中国DBA_XXX或ALL_XXX这类全局视图来获取所有表及字段信息的情况,在GBase中默认是按库进行划分,虽然有少量全局信息(systabnames等)但并不够灵活,所以可以尝试通过TABLE函数和UDR来进行替代,构造出需要的全局视图,由于仍然存在某些不完善的地方,在此仅作为一种思考来进行讨论

通过UDR实现的好处

  1. 字段信息更为灵活,可以根据自己需要进行调整
  2. 在不同业务库共存情况下通过限制dbname来进行信息隔离
  3. 易于对字段名进行调整,来兼容某些应用,减少修改应用工作量

代码

drop function if exists all_tables;
create function all_tables()
returns char(100) as dbname,char(100) as tabname,int as partnum;
define stmt char(200);
define tmp_sql char(20000);
define v_dbname char(100);
define v_tabname char(100);
define v_owner char(100);
define v_partnum int;

let stmt="select dbs_dbsname from sysmaster:sysdbslocale where dbs_dbsname=dbinfo('DBNAME')";
let tmp_sql="";
prepare p from stmt;
declare c cursor for p;
open c;
while(1=1)
fetch c into v_dbname;
if (sqlcode != 100) then
    if(tmp_sql="") then
    let tmp_sql="select '"||trim(v_dbname)||"',tabname,partnum from "||trim(v_dbname)||":systables where tabid>99";
    else
    let tmp_sql=trim(tmp_sql)||" union all select '"||trim(v_dbname)||"',tabname,partnum from "||trim(v_dbname)||":systables where tabid>99";
    end if;
else
    exit;
end if;
end while;
prepare p1 from tmp_sql;
declare c1 cursor for p1;
open c1;
while(1=1)
fetch c1 into v_owner,v_tabname,v_partnum;
if (sqlcode != 100) then
return v_owner,v_tabname,v_partnum with resume;
else
exit;
end if;
end while;
end function;

drop view if exists all_tables;
create view all_tables (owner,tabname,object_id) as
select unnamed_col_1 owner,unnamed_col_2 tabname,unnamed_col_3 object_id from table(all_tables());

上述代码可以在功能上实现全局视图的替代,但也存在着一定的问题

问题

  1. 对于不同于当前库LOCALE的情况,需要通过其他方法进行处理,如分开获取后再进行拼接(由于生产一般情况同一机器LOCALE是一致,在此不做讨论)
  2. 当库数量过多的时候,如上千个库,可能需要进行分批处理,性能也会大幅度下降

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广