執行無法解決的編譯錯誤
如果執行一個過程、函式或者包,或者對檢視執行查詢,Oracle會檢查訪問的物件的狀態,如果物件狀態不正確,則Oracle會嘗試自動編譯物件。
因此絕大部分情況下,可以直接嘗試執行過程,來省略編譯的步驟。但是有的時候,直接執行並不起作用。
看一個簡單的例子。
在本地的tnsnames.ora中加入下面的配置:
TEST112 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.230)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test112)
)
)
下面建立本地的資料庫鏈,指向遠端的資料庫:
SQL> CREATE DATABASE LINK TEST112
2 CONNECT TO TEST IDENTIFIED BY TEST
3 USING 'TEST112';
資料庫連結已建立。
SQL> SELECT * FROM GLOBAL_NAME@TEST112;
GLOBAL_NAME
----------------------------------------------------------------------------
TEST112
建立一個檢視訪問遠端T表,並建立一個過程,在過程中訪問檢視:
SQL> CREATE VIEW V_T112
2 AS SELECT ID FROM T@TEST112;
檢視已建立。
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 UPDATE V_T112 SET ID = ID + 1;
4 END;
5 /
過程已建立。
SQL> EXEC P_TEST
PL/SQL 過程已成功完成。
下面修改TNSNAMES.ORA裡面TEST112的配置,將配置的名稱改變:
TEST1121 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.230)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test112)
)
)
需要注意,由於DATABASE LINK已經處於開啟的狀態,因此再次訪問並不會報錯,必須手工關閉資料庫,再次訪問遠端物件,Oracle才會利用TNSNAMES.ORA重新解析資料庫鏈:
SQL> EXEC P_TEST
PL/SQL 過程已成功完成。
SQL> ROLLBACK;
回退已完成。
SQL> ALTER SESSION CLOSE DATABASE LINK TEST112;
會話已更改。
SQL> EXEC P_TEST
BEGIN P_TEST; END;
*
第 1 行出現錯誤:
ORA-12154: TNS: 無法解析指定的連線識別符號
ORA-06512: 在 "TEST.P_TEST", line 3
ORA-06512: 在 line 1
檢查過程和檢視的狀態:
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('P_TEST', 'V_T112');
OBJECT_NAME STATUS
------------------------------ -------
P_TEST VALID
V_T112 VALID
顯然Oracle並沒有認為執行時的錯誤是由於物件失效造成的。
下面將TNSNAMES.ORA裡面的配置修改回來:
TEST112 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.230)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test112)
)
)
重新執行過程P_TEST:
SQL> EXEC P_TEST
PL/SQL 過程已成功完成。
這個現象是正常的,下面再次重複剛才的步驟,將TNSNAMES.ORA中的配置修改為TEST1121,然後執行P_TEST過程:
SQL> EXEC P_TEST
PL/SQL 過程已成功完成。
SQL> ALTER SESSION CLOSE DATABASE LINK TEST112;
會話已更改。
SQL> EXEC P_TEST
BEGIN P_TEST; END;
*
第 1 行出現錯誤:
ORA-12154: TNS: 無法解析指定的連線識別符號
ORA-06512: 在 "TEST.P_TEST", line 3
ORA-06512: 在 line 1
所有的操作都和剛才一樣,現在不一樣的操作出現了,嘗試直接訪問檢視:
SQL> SELECT * FROM V_T112;
SELECT * FROM V_T112
*
第 1 行出現錯誤:
ORA-12154: TNS: 無法解析指定的連線識別符號
SQL> ALTER VIEW V_T112 COMPILE;
警告: 更改的檢視帶有編譯錯誤。
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('V_T112', 'P_TEST');
OBJECT_NAME STATUS
------------------------------ -------
P_TEST INVALID
V_T112 INVALID
由於檢視的重新編譯,使得檢視和過程的狀態都變成INVALID。
下面將TNSNAMES.ORA中的配置修改正確,再次執行P_TEST過程:
SQL> EXEC P_TEST
BEGIN P_TEST; END;
*
第 1 行出現錯誤:
ORA-06550: 第 1 行, 第 7 列:
PLS-00905: 物件 TEST.P_TEST 無效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
執行仍然報錯,這時手工編譯P_TEST過程也是無效的:
SQL> ALTER PROCEDURE P_TEST COMPILE;
警告: 更改的過程帶有編譯錯誤。
SQL> SHOW ERR
PROCEDURE P_TEST 出現錯誤:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/1 PL/SQL: SQL Statement ignored
3/8 PL/SQL: ORA-04063: view "TEST.V_T112" 有錯誤
無論是直接執行過程,還是手工編譯過程,都無法解決檢視的問題,這時只能透過手工編譯錯誤的檢視才能解決這個錯誤。
SQL> ALTER VIEW V_T112 COMPILE;
檢視已變更。
SQL> ALTER PROCEDURE P_TEST COMPILE;
過程已更改。
SQL> EXEC P_TEST
PL/SQL 過程已成功完成。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-615577/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Idea編譯錯誤解決辦法Idea編譯
- PHP編譯錯誤及解決辦法PHP編譯
- 在RAC 中解決 vipca 和 srvctl 無法執行的錯誤PCA
- OpenCV1.0編譯錯誤解決辦法OpenCV編譯
- ts-jest無法編譯執行ESM【解決步驟】編譯
- qt編譯報錯 無法執行“rc.exe”QT編譯
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤PHP編譯
- ClamAV無法更新錯誤解決
- 編譯EJB出現錯誤的解決編譯
- CentOS 中yum命令執行錯誤解決辦法CentOS
- 編譯notepad++的錯誤解決編譯
- Android編譯通過,執行編譯錯誤問題總結Android編譯
- isNaN("abc")編譯報錯解決辦法NaN編譯
- 解決 Angular 官網下載的庫 Schematics 執行 npm run build 時遇到的編譯錯誤AngularNPMUI編譯
- JNI命令列下編譯錯誤解決方案命令列編譯
- ios交叉比編譯android錯誤解決iOS編譯Android
- Winform無法載入基類的錯誤解決ORM
- 在impdp匯入報編譯錯誤ORA-39082的解決辦法編譯
- 執行 PHP artisan migrate 時報長度錯誤的解決辦法?PHP
- win10系統無法執行掃描程式提示scanner錯誤怎麼解決Win10
- 儲存過程被鎖無法編譯的解決儲存過程編譯
- win10系統Rstudio無法啟動或執行出現錯誤的解決步驟Win10
- tail +數字 無法開啟錯誤解決(ubutu)AI
- .NET 編譯執行or解釋執行?編譯
- 編譯PHP的錯誤編譯PHP
- 執行Docker命令報錯解決辦法Docker
- dbua後資料庫無法啟動錯誤的解決資料庫
- win10提示由於裝置錯誤,無法執行此項請求怎麼解決Win10
- WCF執行錯誤:“此集合已經包含方案 http 的地址”的解決辦法HTTP
- PHP編譯,執行make報錯PHP編譯
- Mahout學習之執行canopy演算法錯誤及解決辦法演算法
- 解決aix下不能執行netca的錯誤AI
- VS 編譯錯誤編譯
- kali無法執行cobaltstrike3.6解決方案
- 執行 valet 提示 sudo 問題和 undefined function Valet\collect () 錯誤的解決辦法UndefinedFunction
- Laravel 執行 Gulp 命令出錯解決辦法Laravel
- dns錯誤怎麼辦 dns錯誤的解決辦法DNS
- Docker Hello World容器執行報錯的解決辦法Docker