問題:有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
return(2);
在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 [email protected] 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機的,經測試,未重制這個現象,原因不明