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中用到的本地数据库对象用这些变量替换。

 

你可能感兴趣的:(oracle,sql,工作)