今天在现场进行测试时,必须在A库上往B库插入数据,但是测试中出现一些问题。 在A库建一个database link LINK_NOAP,查看B库的一个表test。 SQL> select * from test@link_noap; select * from test@link_noap ORA-02085: database link LINK_NOAP.REGRESS.RDBMS.DEV.US.ORACLE.COM connects to NOAP
ORACLE官方文档是这样解释的: ORA-02085: database link string connects to string Cause:a database link connected to a database with a different name. The connection is rejected. Action::create a database link with the same name as the database it connects to,or set global_names=false. SQL> show parameter global_names NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ global_names boolean TRUE
哦,忘了,刚才测试将这个字段改成true了。好吧,我把global_names修改为false。 查询是没问题了,而且下面这样的插入语句也没有问题: SQL> insert into test@link_noap(id) 2 select id from test; 53 rows inserted
但是其他问题又来了,当执行下面插入语句,注意查询语句中含有本地自增序列: SQL> create sequence sq_test_1 start with 1 increment by 1; Sequence created SQL> insert into test@noap(id) 2 select sq_test_1.nextval from dual; insert into test@noap(id) select sq_test_1.nextval from dual ORA-02069: global_names parameter must be set to TRUE for this operation 这是肿么了? ORACLE官方文档解释: ORA-02069: global_names parameter must be set to TRUE for this operation Cause: A remote mapping of the statement is required but cannot be achieved because global_names should be set to TRUE for it to be achieved Action: Issue alter session set global_names = true if possible
但是从上面来看,将global_names设置为true是不可行了。其实oracle安装中默认global_names 就是FALSE的,如果变成true在DBLINK利用的时候会出现很多问题,例如上面ORA-02085。上网查 资料还有盆友建议将database link的名字和远程的数据库oracle_sid保持一致,但是两台数据 库在客户那都跑了好几年了,并且许多过程都有用到,这种解决方法肯定不可行。
但是这个插入语句是多么滴简单啊,暂时得出解决方法也算得出的暂时结论吧:在插入远程表时, 不能调用本地序列。 执行如下: SQL> insert into test@link_noap(id) 2 select sq_test_1.nextval@link_noap from dual; 1 rows inserted
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24496749/viewspace-723263/ ,如需转载,请注明出处,否则将追究法律责任。