OBJECT_ID的重用
Oracle對於過程會重用OBJECT_ID。這裡的過程是指過程、函式、包和物件的總稱。
看一個簡單的例子:
SQL> CONN YANGTK/YANGTK
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
53169 P_TEST
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
53169 P_TEST
SQL> DROP PROCEDURE P_TEST;
過程已刪除。
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
53169 P_TEST
對於CREATE OR REPLACE操作,並不會改變物件的OBJECT_ID,但是對於DROP和CREATE操作來說,Oracle也可以重用原來的OBJECT_ID。
而且這個重用並不需要刪除操作和建立操作之間有任何的連續性:
SQL> DROP PROCEDURE P_TEST;
過程已刪除。
SQL> CREATE PROCEDURE P_TEST1 AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE 'P_TEST%';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
55490 P_TEST1
SQL> CREATE PROCEDURE P_TEST AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE 'P_TEST%';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
53169 P_TEST
55490 P_TEST1
從上面的結果也可以看出,其實P_TEST過程重用的OBJECT_ID是很早之前產生的,顯然這個例子開始時候建立P_TEST的時候,已經是重用OBJECT_ID了。
這說明OBJECT_ID的重用和資料庫的會話沒有關係。因為這是一個新登陸的會話,執行的過程建立就會重用OBJECT_ID。那麼資料庫例項的狀態是否會影響OBJECT_ID的重用呢:
SQL> DROP PROCEDURE P_TEST;
過程已刪除。
SQL> CONN / AS SYSDBA
已連線。
SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> STARTUP
ORACLE 例程已經啟動。
Total System Global Area 603979776 bytes
Fixed Size 1249332 bytes
Variable Size 159387596 bytes
Database Buffers 436207616 bytes
Redo Buffers 7135232 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> CONN YANGTK/YANGTK
已連線。
SQL> CREATE PROCEDURE P_TEST AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE 'P_TEST%';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
55496 P_TEST
55490 P_TEST1
看來OBJECT_ID的重用與Oracle例項中記憶體裡面的某些記錄有關。而且,Oracle重用OBJECT_ID似乎只關心名稱而不關心過程的內容:
SQL> DROP PROCEDURE P_TEST;
過程已刪除。
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 DBMS_OUTPUT.PUT_LINE('THIS PROCEDURE IS DIFFERENENT!');
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
55496 P_TEST
SQL> DROP PROCEDURE P_TEST;
過程已刪除。
SQL> CREATE OR REPLACE FUNCTION P_TEST RETURN NUMBER AS
2 BEGIN
3 RETURN 1;
4 END;
5 /
函式已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
55496 P_TEST
SQL> DROP FUNCTION P_TEST;
函式已刪除。
SQL> CREATE PACKAGE P_TEST AS
2 PROCEDURE P_ABC;
3 END;
4 /
程式包已建立。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
55496 P_TEST
從這個例子以可以看到,Oracle不止不關心前後兩次內容是否相同,連是否相同物件都不關心。不管過程、函式還是包,只要名稱相同,就可以重用OBJECT_ID。
SQL> DROP PACKAGE P_TEST;
程式包已刪除。
SQL> CREATE PROCEDURE USER_A.P_TEST AS
2 BEGIN
3 NULL;
4 END;
5 /
過程已建立。
SQL> SELECT OBJECT_ID, OWNER, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME = 'P_TEST';
OBJECT_ID OWNER OBJECT_NAME
---------- ------------------------------ ------------------------------
55497 USER_A P_TEST
除了名稱,過程的OWNER顯然也是Oracle關心的物件。
根據上面的特點,推測Oracle在記憶體中記錄了每個使用者的每個過程對應的OBJECT_ID,而這個OBJECT_ID的記錄並沒有隨著過程的刪除而刪掉,因此同名的過程重新建立時,就可以重用這個OBJECT_ID。
OBJECT_ID的重用只對過程、函式和包有效,而表、索引等其他型別的物件沒有這個特性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-216928/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 重用其他程式庫
- [20191204]oracle能建立最大object_id是多少.txtOracleObject
- iOS開發-UITableView的重用機制iOSUIView
- 從重複到重用
- [20180702]物件名重用.txt物件
- golang slice 和 string 重用Golang
- [20191206]為什麼oracle能建立最大object_id=4254950910.txtOracleObject
- ThreadLocal執行緒重用時帶來的問題thread執行緒
- SAP ABAP Gateway Client 的 ABAP 實現,重用 HTTP ConnectionGatewayclientHTTP
- WPF中的命令模式:打造清晰、可重用的程式碼利器模式
- 增強 React 列表渲染:乾淨且可重用的模式React模式
- 程式碼質量第 2 層 - 可重用的程式碼
- 使用 Spring Boot 構建可重用的模擬模組Spring Boot
- 可重用性是一個謬論 - UWE FRIEDRICHSEN
- 如何重用瀏覽器tab開啟頁面瀏覽器
- 軟體開發重點放在重用上是錯誤的 - Grady
- Go HTTP 重用底層 TCP 連線需要注意的關鍵點GoHTTPTCP
- Spartacus 使用 Command 設計模式之後對以前 Connector 實現的重用設計模式
- 詳解 Node.Js 中實現埠重用原理Node.js
- Android MVP架構改造~如何重用頂層業務AndroidMVP架構
- OpenHarmony定義元件重用樣式:@Styles裝飾器元件
- Java 繼承與多型:程式碼重用與靈活性的巧妙結合Java繼承多型
- C#中透過ObjectPool重用物件提高程式效能C#Object物件
- Java物件重用如何降低延遲並提高效能 - MinborgJava物件
- 轉行學IT沒前途?一個培訓班出來的,憑什麼受到重用?
- Java程式設計(2021春)——第三章類的重用筆記與思考Java程式設計筆記
- 如何在 SAP BTP 平臺上重用另一個已經開發好的 service
- Java 抽象類與方法:實現安全性與程式碼重用Java抽象
- 為什麼程式碼重用仍然是一個安全噩夢
- 關於VScode報錯“終端將被任務重用,按任意鍵關閉”的解決方案VSCode
- 三星Android OS加密漏洞分析:IV重用攻擊與降級攻擊Android加密
- 一個技術總監的忠告:精通那麼多技術,你為何還是受不到重用?
- 【NX/UG】解決:使用重用庫的零件,下次開啟發現零件丟失問題
- 重用或複用會導致耦合,微服務是寧可重複也不耦合 - Victor Rentea微服務
- 一步步瞭解執行緒池之可重用固定執行緒數-FixedThreadPool執行緒thread
- JavaScript的this的指向JavaScript
- lua的for的坑
- Element-UI的table表格的樣式的常用的操作UI
- 新的地方,新的工作,新的生活