oracle timestamp比较大小_ORACLE包和过程依赖关系测试
一、概念
如果一個(gè)對(duì)象的定義中引用了其他對(duì)象,那么此對(duì)象被稱(chēng)為依賴(lài)對(duì)象(dependent object),此對(duì)象所引用的對(duì)象被稱(chēng)為引用對(duì)象(referenced object)。為了管理方案對(duì)象(schema object)間的依賴(lài)關(guān)系,Oracle 需要記錄所有的方案的狀態(tài)(status):
有效的(valid)已經(jīng)通過(guò)編譯,可以在被引用時(shí)直接使用。
無(wú)效的(invalid)必須在使用之前進(jìn)行編譯。
INVALID狀態(tài)對(duì)于過(guò)程,函數(shù)和包來(lái)說(shuō),這意味著對(duì)其進(jìn)行編譯
INVALID狀態(tài)對(duì)于視圖來(lái)說(shuō),這意味著此視圖必須使用引用對(duì)象(referenced object)當(dāng)前在數(shù)據(jù)字典中的定義信息重新進(jìn)行語(yǔ)法分析(parse)。
狀態(tài)記錄是一個(gè)遞歸的過(guò)程。引用對(duì)象(referenced object)的狀態(tài)變化不僅會(huì)導(dǎo)致其直接依賴(lài)對(duì)象(directly dependent object)的狀態(tài)變化,同時(shí)會(huì)影響其間接依賴(lài)對(duì)象(indirectly dependent object)的狀態(tài)。
當(dāng)一個(gè)方案對(duì)象(schema object)在 SQL 語(yǔ)句中被直接引用或被此語(yǔ)句中的依賴(lài)對(duì)象(dependent object)所引用(間接引用)時(shí),Oracle 均會(huì)在需要時(shí)對(duì)其狀態(tài)進(jìn)行檢查。SQL 語(yǔ)句中被直接或間接引用的對(duì)象的狀態(tài)決定了 Oracle 的后續(xù)操作:
1)如果 SQL 語(yǔ)句中所有的引用對(duì)象(referenced object)均處于有效狀態(tài),則 Oracle 無(wú)需進(jìn)行其他工作就可以直接執(zhí)行 SQL 語(yǔ)句
2) 如果 SQL 語(yǔ)句中存在無(wú)效的引用(referenced)視圖或 PL/SQL 程序結(jié)構(gòu)(過(guò)程,函數(shù),或包),Oracle 將自動(dòng)地嘗試編譯這些對(duì)象
引用對(duì)象修改后可能出現(xiàn)的情況如下:
如果引用表被修改,則依賴(lài)過(guò)程(dependent procedure)將處于無(wú)效狀態(tài)
如果引用視圖的基表(base table)被修改,則此視圖及依賴(lài)過(guò)程都將處于無(wú)效狀態(tài)。
如果引用獨(dú)立過(guò)程被替換(replace),則依賴(lài)過(guò)程將處于無(wú)效狀態(tài)。
如果引用包的定義(body)被替換,則依賴(lài)過(guò)程不受影響。但是當(dāng)引用包的聲明(specification)被替換后,依賴(lài)過(guò)程將處于無(wú)效狀態(tài)。這是一種利用包來(lái)減少過(guò)程與引用對(duì)象之間依賴(lài)性的機(jī)制。
在分布式數(shù)據(jù)庫(kù)系統(tǒng)中,函數(shù),包,觸發(fā)器等存儲(chǔ)過(guò)程間的依賴(lài)性是通過(guò)時(shí)間戳檢查(time stamp checking)或特征標(biāo)識(shí)檢查(signature checking)來(lái)進(jìn)行管理的。
時(shí)間戳檢查
在時(shí)間戳檢查模式下,一個(gè)過(guò)程被編譯或重編譯時(shí)的時(shí)間戳(即一個(gè)過(guò)程被創(chuàng)建,修改或替換的時(shí)間)將被記錄在數(shù)據(jù)字典中。同時(shí)還將記錄此過(guò)程的版本信息,包括此過(guò)程所引用的所有遠(yuǎn)程過(guò)程的所屬方案,包名稱(chēng),過(guò)程名稱(chēng),及時(shí)間戳。
當(dāng)運(yùn)行一個(gè)依賴(lài)過(guò)程時(shí),Oracle 將對(duì)此過(guò)程編譯時(shí)所記錄的遠(yuǎn)程時(shí)間戳與遠(yuǎn)程引用對(duì)象當(dāng)前的時(shí)間戳進(jìn)行比較。根據(jù)比較結(jié)果,可能有兩種情況發(fā)生:
如果時(shí)間戳比較結(jié)果一致,那么本地及遠(yuǎn)程過(guò)程均無(wú)需編譯就可直接運(yùn)行。
如果存在時(shí)間戳比較結(jié)果不一致的遠(yuǎn)程引用對(duì)象,那么本地過(guò)程將被置為無(wú)效狀態(tài),并向此過(guò)程的調(diào)用者發(fā)送一個(gè)錯(cuò)誤信息。此后,Oracle 還會(huì)將所有引用了時(shí)間戳發(fā)生變化的遠(yuǎn)程過(guò)程的本地過(guò)程置為無(wú)效狀態(tài)。例如,多個(gè)本地過(guò)程中都需調(diào)用一個(gè)遠(yuǎn)程過(guò)程,且此遠(yuǎn)程過(guò)程進(jìn)行了重編譯。當(dāng)一個(gè)本地過(guò)程開(kāi)始運(yùn)行,并發(fā)現(xiàn)遠(yuǎn)程過(guò)程的時(shí)間戳有變后,所有依賴(lài)于此遠(yuǎn)程過(guò)程的本地過(guò)程都將被置為無(wú)效狀態(tài)。
時(shí)間戳的比較發(fā)生在本地過(guò)程中調(diào)用遠(yuǎn)程過(guò)程的語(yǔ)句執(zhí)行時(shí)。此時(shí) Oracle 才會(huì)使用分布式數(shù)據(jù)庫(kù)的通信鏈接(communications link)對(duì)兩個(gè)時(shí)間戳進(jìn)行比較。因此,本地過(guò)程中位于無(wú)效遠(yuǎn)程過(guò)程調(diào)用之前的語(yǔ)句可能全部運(yùn)行正常,而之后的語(yǔ)句則根本不會(huì)運(yùn)行。此時(shí)必須對(duì)本地過(guò)程進(jìn)行重編譯。
在同一個(gè)數(shù)據(jù)庫(kù)內(nèi),被引用對(duì)象上進(jìn)行了alter、drop等操作,該對(duì)象的依賴(lài)對(duì)象如view、function、procedure等,狀態(tài)會(huì)自動(dòng)標(biāo)記為Invalid,再重新使用這些依賴(lài)對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)重新compile。
而一個(gè)數(shù)據(jù)庫(kù)內(nèi)的對(duì)象引用了遠(yuǎn)程數(shù)據(jù)庫(kù)的對(duì)象(這里指程序?qū)ο?#xff0c;如procedure等),則遠(yuǎn)程數(shù)據(jù)庫(kù)對(duì)象發(fā)生了變更,由于本地?cái)?shù)據(jù)庫(kù)并不知曉此種情況,本地?cái)?shù)據(jù)庫(kù)的這些對(duì)象狀態(tài)仍然為valid,在調(diào)用這些對(duì)象時(shí),Oracle會(huì)根據(jù)remote_dependencies_mode參數(shù)值,確定采用timestamp或signature進(jìn)行依賴(lài)性檢查。如果發(fā)現(xiàn)不匹配,則會(huì)直接報(bào)錯(cuò)返回,同時(shí)將依賴(lài)該遠(yuǎn)程對(duì)象的所有本地對(duì)象標(biāo)記為invalid。
二、測(cè)試存儲(chǔ)過(guò)程的last_ddl_time和timestamp何時(shí)發(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
/
--存儲(chǔ)過(guò)程狀態(tài)為valid,編譯存儲(chǔ)過(guò)程,不改變內(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
--對(duì)存儲(chǔ)過(guò)程依賴(lài)的表進(jìn)行修改,過(guò)程狀態(tài)變?yōu)閕nvalid
select *
from user_objects u
where u.OBJECT_TYPE='PROCEDURE'
AND U.OBJECT_NAME='PROC_JIFEN_CX'
/
--存儲(chǔ)過(guò)程狀態(tài)為invalid,編譯存儲(chǔ)過(guò)程,狀態(tài)變?yōu)関alid,last_ddl_time和timestamp都改為最新的
---遠(yuǎn)程數(shù)據(jù)庫(kù)調(diào)用執(zhí)行報(bào)錯(cuò)ORA-04062: timestamp of procedure "EDU.PROC_JIFEN_CX" has been changed; 過(guò)程狀態(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
三、測(cè)試package body的last_ddl_time和timestamp何時(shí)發(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)
--修改依賴(lài)表的表結(jié)構(gòu),package body狀態(tài)為invalid,package狀態(tài)為valid,遠(yuǎn)程數(shù)據(jù)庫(kù)調(diào)用包執(zhí)行正常,且執(zhí)行過(guò)后package body已編譯通過(guò)狀態(tài)為valid,last_ddl_time和timestamp都已修改為當(dāng)前時(shí)間
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
/
--遠(yuǎn)程數(shù)據(jù)庫(kù)調(diào)用包執(zhí)行正常,且執(zhí)行過(guò)后package body狀態(tài)為valid,last_ddl_time和timestamp都已修改為當(dāng)前時(shí)間
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包和过程依赖关系测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql error 1148_MYS
- 下一篇: python 项目管理_【Python基