日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle timestamp比较大小_ORACLE包和过程依赖关系测试

發(fā)布時間:2024/4/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle timestamp比较大小_ORACLE包和过程依赖关系测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概念

如果一個對象的定義中引用了其他對象,那么此對象被稱為依賴對象(dependent object),此對象所引用的對象被稱為引用對象(referenced object)。為了管理方案對象(schema object)間的依賴關(guān)系,Oracle 需要記錄所有的方案的狀態(tài)(status):

有效的(valid)已經(jīng)通過編譯,可以在被引用時直接使用。

無效的(invalid)必須在使用之前進行編譯。

INVALID狀態(tài)對于過程,函數(shù)和包來說,這意味著對其進行編譯

INVALID狀態(tài)對于視圖來說,這意味著此視圖必須使用引用對象(referenced object)當(dāng)前在數(shù)據(jù)字典中的定義信息重新進行語法分析(parse)。

狀態(tài)記錄是一個遞歸的過程。引用對象(referenced object)的狀態(tài)變化不僅會導(dǎo)致其直接依賴對象(directly dependent object)的狀態(tài)變化,同時會影響其間接依賴對象(indirectly dependent object)的狀態(tài)。

當(dāng)一個方案對象(schema object)在 SQL 語句中被直接引用或被此語句中的依賴對象(dependent object)所引用(間接引用)時,Oracle 均會在需要時對其狀態(tài)進行檢查。SQL 語句中被直接或間接引用的對象的狀態(tài)決定了 Oracle 的后續(xù)操作:

1)如果 SQL 語句中所有的引用對象(referenced object)均處于有效狀態(tài),則 Oracle 無需進行其他工作就可以直接執(zhí)行 SQL 語句

2) 如果 SQL 語句中存在無效的引用(referenced)視圖或 PL/SQL 程序結(jié)構(gòu)(過程,函數(shù),或包),Oracle 將自動地嘗試編譯這些對象

引用對象修改后可能出現(xiàn)的情況如下:

如果引用表被修改,則依賴過程(dependent procedure)將處于無效狀態(tài)

如果引用視圖的基表(base table)被修改,則此視圖及依賴過程都將處于無效狀態(tài)。

如果引用獨立過程被替換(replace),則依賴過程將處于無效狀態(tài)。

如果引用包的定義(body)被替換,則依賴過程不受影響。但是當(dāng)引用包的聲明(specification)被替換后,依賴過程將處于無效狀態(tài)。這是一種利用包來減少過程與引用對象之間依賴性的機制。

在分布式數(shù)據(jù)庫系統(tǒng)中,函數(shù),包,觸發(fā)器等存儲過程間的依賴性是通過時間戳檢查(time stamp checking)或特征標(biāo)識檢查(signature checking)來進行管理的。

時間戳檢查

在時間戳檢查模式下,一個過程被編譯或重編譯時的時間戳(即一個過程被創(chuàng)建,修改或替換的時間)將被記錄在數(shù)據(jù)字典中。同時還將記錄此過程的版本信息,包括此過程所引用的所有遠程過程的所屬方案,包名稱,過程名稱,及時間戳。

當(dāng)運行一個依賴過程時,Oracle 將對此過程編譯時所記錄的遠程時間戳與遠程引用對象當(dāng)前的時間戳進行比較。根據(jù)比較結(jié)果,可能有兩種情況發(fā)生:

如果時間戳比較結(jié)果一致,那么本地及遠程過程均無需編譯就可直接運行。

如果存在時間戳比較結(jié)果不一致的遠程引用對象,那么本地過程將被置為無效狀態(tài),并向此過程的調(diào)用者發(fā)送一個錯誤信息。此后,Oracle 還會將所有引用了時間戳發(fā)生變化的遠程過程的本地過程置為無效狀態(tài)。例如,多個本地過程中都需調(diào)用一個遠程過程,且此遠程過程進行了重編譯。當(dāng)一個本地過程開始運行,并發(fā)現(xiàn)遠程過程的時間戳有變后,所有依賴于此遠程過程的本地過程都將被置為無效狀態(tài)。

時間戳的比較發(fā)生在本地過程中調(diào)用遠程過程的語句執(zhí)行時。此時 Oracle 才會使用分布式數(shù)據(jù)庫的通信鏈接(communications link)對兩個時間戳進行比較。因此,本地過程中位于無效遠程過程調(diào)用之前的語句可能全部運行正常,而之后的語句則根本不會運行。此時必須對本地過程進行重編譯。

在同一個數(shù)據(jù)庫內(nèi),被引用對象上進行了alter、drop等操作,該對象的依賴對象如view、function、procedure等,狀態(tài)會自動標(biāo)記為Invalid,再重新使用這些依賴對象時,系統(tǒng)會自動重新compile。

而一個數(shù)據(jù)庫內(nèi)的對象引用了遠程數(shù)據(jù)庫的對象(這里指程序?qū)ο?#xff0c;如procedure等),則遠程數(shù)據(jù)庫對象發(fā)生了變更,由于本地數(shù)據(jù)庫并不知曉此種情況,本地數(shù)據(jù)庫的這些對象狀態(tài)仍然為valid,在調(diào)用這些對象時,Oracle會根據(jù)remote_dependencies_mode參數(shù)值,確定采用timestamp或signature進行依賴性檢查。如果發(fā)現(xiàn)不匹配,則會直接報錯返回,同時將依賴該遠程對象的所有本地對象標(biāo)記為invalid。

二、測試存儲過程的last_ddl_time和timestamp何時發(fā)生變化

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-9-16 22:19:31.000 2010-09-16:22:19:31 VALID

/

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

/

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-11-5 11:38:09.000 2010-09-16:22:19:31 VALID

/

--存儲過程狀態(tài)為valid,編譯存儲過程,不改變內(nèi)容,last_ddl_time改變,timestamp不變;

alter table JIFEN_CX_LOG add nyytest number(2)

/

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

/

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-11-5 11:38:09.000 2010-09-16:22:19:31 INVALID

--對存儲過程依賴的表進行修改,過程狀態(tài)變?yōu)閕nvalid

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

/

--存儲過程狀態(tài)為invalid,編譯存儲過程,狀態(tài)變?yōu)関alid,last_ddl_time和timestamp都改為最新的

---遠程數(shù)據(jù)庫調(diào)用執(zhí)行報錯ORA-04062: timestamp of procedure "EDU.PROC_JIFEN_CX" has been changed; 過程狀態(tài)已為valid,再次執(zhí)行成功,last_ddl_time和timestamp都改為最新的

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL] 559675 [NULL] PROCEDURE 2010-5-5 17:47:58.000 2010-11-5 11:42:40.000 2010-11-05:11:42:40 VALID

三、測試package body的last_ddl_time和timestamp何時發(fā)生變化

select *

from user_objects u

where U.OBJECT_NAME='PKG_JIFEN_CX_SET'

AND OBJECT_TYPE='PACKAGE BODY'

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP

PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:48:45.000 2010-11-05:11:48:45

---編譯之前狀態(tài)為valid,編譯之后,last_ddl_time變化,timestamp不變

select *

from user_objects u

where U.OBJECT_NAME='PKG_JIFEN_CX_SET'

AND OBJECT_TYPE='PACKAGE BODY'

/

select *

from user_objects u

where U.OBJECT_NAME='PKG_JIFEN_CX_SET'

AND OBJECT_TYPE='PACKAGE'

/

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:51:23.000 2010-11-05:11:48:45 VALID

/

alter table JIFEN_CX_LOG add nyytest number(2)

--修改依賴表的表結(jié)構(gòu),package body狀態(tài)為invalid,package狀態(tài)為valid,遠程數(shù)據(jù)庫調(diào)用包執(zhí)行正常,且執(zhí)行過后package body已編譯通過狀態(tài)為valid,last_ddl_time和timestamp都已修改為當(dāng)前時間

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:51:23.000 2010-11-05:11:48:45 INVALID

/

--遠程數(shù)據(jù)庫調(diào)用包執(zhí)行正常,且執(zhí)行過后package body狀態(tài)為valid,last_ddl_time和timestamp都已修改為當(dāng)前時間

OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS

PKG_JIFEN_CX_SET [NULL] 192968 [NULL] PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:54:55.000 2010-11-05:11:54:55 VALID

總結(jié)

以上是生活随笔為你收集整理的oracle timestamp比较大小_ORACLE包和过程依赖关系测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。