oracle中只能通过dblink查询远程数据库而不能插入的问题

在oracle 中要创建database link,首先得授予用户相应权限。一般情况下,用相应命令建好dblink后就可以使用了,并不需要 alter system set global_names=true。

昨天遇到莫名其妙的问题,在pl/sql中可以对dblink链接的数据库执行查询和插入操作,但是在procedure中执行插入操作时就会报错。并且提示信息为“global_name 应该设置为true”。

后来测试了各种情况后发现症结所在。global_name保持默认的false就行了,在向dblink指向的数据库中插入数据的sql语句中,不能用到本地的数据库对象,常见的有sequence,function,view等。如果你在不知情的情况下不幸用到了,oracle会很变态的提示你“global_name 应该设置为true”,并不是说“对象不存在”类似的信息。这样的提示信息会让你绕一个大圈子。

原因很简单,这里就要说到dblink的工作原理了。你在本地procedure中操作dblink指向数据库的sql语句,最终是发送到到远程数据库后再执行的,这样语句中包含的本地数据库对象就理所当然的失效了!

解决方法:把本地数据库对象执行的最终执行结果保存到变量中,再把sql中用到的本地数据库对象用这些变量替换。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值