天天看點

有關SYSDATE與DBLINK的問題

問題:有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機的,經測試,未重制這個現象,原因不明