问题:有A,B两数据库,连接到A机,对于SELECT SYSDATE FROM DUAL@TOB 来说,这个SYSDATE从A机取时间,还是B机取时间?
测试证明是从A机,应该是ORACLE 分析发现这个SYSDATE函数在A机即存在,且与DUAL对象之间没有依赖关系,则在A机执行这个函数代码,为证明ORACLE是这样做的,示例如下:在A机上建一个自定义函数:create or replace function f_test return number is
begin
return(1);
end f_test;
在B机上建同名函数,但返回值不同,如下:
create or replace function f_test return number is
begin
return(2);
end f_test;
在A机上执行SQL:
select f_test from dual@to201
返回值为1,删除A机上的f_test函数后,执行SQL:
Select f_test from dual@to201
报无效标识符错,再执行SQL:
select f_test@to201 from dual@to201
或
select f_test@to201 from dual
返回值为2,
结论:说明ORACLE 确实是在验证SQL相关对象时,先优先在本机查找对象的,如果要指定使用目标对象,则需要用DBLINK标识符来声明。
按以上结论,对sysdate使用DBLINK标识符:
Select sysdate@to201 from dual@to201 ,
报错:未找到预期FROM关键字,如下也不行:
Select standard@to201.sysdate from dual@to201
原因不明
如果硬要使用B机的SYSDATE函数,则在B机用户下建一个视图:
create view mydate as select sysdate mydate from dual
然后在A机:
select mydate from mydate@to201
正常。
BTW:
有同事反映说有这样一种情况,在SQLPLUS 下手工:
select sysdate from dual@tob
返回的是A机(本机)的时间,但如果在触发器中执行这个SQL,,获得的时间却是B机的,经测试,未重现这个现象,原因不明