Oracle存储过程报错ORA-02069: global_names parameter must be
今天开发给发邮件过来说一个存储过程想通过dblink往目标库insert数据,但报错ORA-02069: global_names parameter must be set to TRUE for this operation,想让我根据错误提示在数据库上修改global_names参数修改为True。 先来看看官方文档是如何介绍这个参数的: GLOBAL_NAMESspecifies whether a database link is required to have the same name asthe database to which it connects. 从下面的查询可以看出global_names参数可以在线进行修改的 zx@TEST>colnamefora30 zx@TEST>selectname,ISSES_MODIFIABLE,ISSYS_MODIFIABLEfromv$parameterwherename='global_names'; NAME ISSES_MODIFIABLISSYS_MODIFIABLE ------------------------------------------------------------------------ global_names TRUE IMMEDIATE 看完了这个参数,再来看看开发的存储过程代码,其中insert语句中是用到了一个序列,所以导致了这个报错。先在测试数据库上创建了一个简单的存储过程来模拟现再这个问题 创建一个dblink zx@TEST>createdatabaselinklink_orclconnecttozxidentifiedby"zx"using'orcl'; Databaselinkcreated. zx@TEST>select*fromdual@link_orcl; DUM --- X 先创建一个不带序列的远程insert的存储过程 zx@TEST>createorreplaceprocedurepro_aas 2begin 3insertintot2@link_orcl(c1)values('a'); 4commit; 5end; 6/ Procedurecreated. 执行这个存储过程,观察结果,数据可以正常插入 zx@TEST>select*fromt2@link_orcl; norowsselected zx@TEST>execpro_a; PL/SQLproceduresuccessfullycompleted. zx@TEST>selectc1fromt2@link_orcl; C1 --- a 创建一个序列,并修改上面的存储过程 zx@TEST>createsequenceseq_a; Sequencecreated. zx@TEST>createorreplaceprocedurepro_aas 2begin 3insertintot2@link_orcl(c1,n1)values('a',seq_a.nextval); 4commit; 5end; 6/ Procedurecreated. 执行修改后的存储过程,重现上面的错误ORA-02069 zx@TEST>execpro_a; BEGINpro_a;END; * ERRORatline1: ORA-02069:global_namesparametermustbesettoTRUEforthisoperation ORA-06512:at"ZX.PRO_A",line3 ORA-06512:atline1 先在session层面修改global_names参数,再次执行存储过程,又出现了新的错误:说两端的数据库名不一致。 zx@TEST>altersessionsetglobal_names=true; Sessionaltered. zx@TEST>execpro_a; BEGINpro_a;END; * ERRORatline1: ORA-02085:databaselinkLINK_ORCLconnectstoORCL ORA-06512:at"ZX.PRO_A",line3 ORA-06512:atline1 zx@TEST>!oerrora2085 02085,00000,"databaselink%sconnectsto%s" //*Cause:adatabaselinkconnectedtoadatabasewithadifferentname. //Theconnectionisrejected. //*Action:createadatabaselinkwiththesamenameasthedatabaseit //connectsto,orsetglobal_names=false. 那现在问题来了,实际生产中源端和目标端的数据库名肯定是不一致的,所以修改这个参数并不能解决这个问题。 只能想其他的办法来绕过这个错误,这里给开发提了两个建议: 1、把存储过程部署到目标端来避免远程insert中调用sequence 2、在源端存储过程中引入临时表,先把数据插入临时表,再从临时表插入到远端表。 在MOS上搜到了一个相关文档(ORA-02069 DURING REMOTE INSERT OF A LOCAL SEQUENCE (文档 ID 1047673.6))跟我们的问题描述一致。 官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams098.htm#REFRN10065 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |