安裝順序:Oracle 11g → PL/SQL → Oracle Client。配置 `tnsnames.ora`、環境變量後,PL/SQL 彈出連接錯誤,但 `sqlplus` 正常。
安裝路徑示例:
Oracle 11g: D:\app\oracle\product\11.2.0\dbhome_1 (SERVER)
Oracle Client: D:\app\oracle\product\11.2.0\client_1 (CLIENT)
PL/SQL: C:\Program Files\PLSQL Developer
| 檢查項 | 正確配置 | 常見錯誤 |
|---|---|---|
| PL/SQL 首選項 → Oracle Home | 指向 **Client** 目錄 (`client_1`) | 指向 Server 目錄 或 未設置 |
| PL/SQL 首選項 → OCI Library | `$ORACLE_HOME\bin\oci.dll` (Client下) | 指向 Server 的 oci.dll |
| TNS_ADMIN 環境變量 | 指向 Client 的 `network\admin` | 指向 Server、或未設置、路徑有空格 |
| tnsnames.ora 位置 | `$TNS_ADMIN\tnsnames.ora` | 放在 `bin` 目錄、或多份副本不一致 |
| PATH 環境變量順序 | Client `bin` 在 Server `bin` **之前** | Server 在前,加載錯誤版本 DLL |
# 位置: D:\app\oracle\product\11.2.0\client_1\network\admin\tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
# 僅設置這兩個,避免污染
ORACLE_HOME=D:\app\oracle\product\11.2.0\client_1
TNS_ADMIN=%ORACLE_HOME%\network\admin
PATH=%ORACLE_HOME%\bin;%PATH%
# 刪除 NLS_LANG(讓數據庫會話自動協商)
| 錯誤碼 | 含義 | 解決 |
|---|---|---|
| ORA-12154 | TNS:could not resolve the connect identifier | tnsnames.ora 路徑/內容錯誤 |
| ORA-12541 | TNS:no listener | 監聽器未啟動 / HOST/PORT 錯誤 |
| ORA-12514 | TNS:listener does not currently know of service | SERVICE_NAME 與數據庫實例不匹配 |
| ORA-28040 | No matching authentication protocol | 客戶端/服務端加密協議不兼容,升級客戶端或降級服務端 SQLNET.ORA |
PL/SQL 連不上、sqlplus 能連,**核心是 PL/SQL 使用的 Oracle Home 與 Client 不一致**。統一 `Oracle Home`、`OCI Library`、`TNS_ADMIN`、`PATH` 指向同一 Client 目錄,刪除多餘環境變量,重啟 PL/SQL 即解。