想要連上Oracle資料庫,需要先安裝Oracle資料庫的客戶端程式在作業系統環境中。Oracle資料庫的客戶端有分為「Oracle Client」和「Oracle Instant Client」兩種,前者是完整的Oracle資料庫的客戶端程式和工具,很大一包,需要進行安裝的動作;而後者則拆分出了多個函式庫和執行檔,直接從官網上下載下來解壓縮就可以使用。如果我們只是希望Oracle資料庫的應用程式或是我們自己開發的程式能夠連上並使用PL/SQL來存取Oracle資料庫,只需要使用Oracle Instant Client即可。



在開始這篇文章之前,為了避免各位花費不必要的時間,在此還是先提醒一下。如果您是想找Oracle資料庫的圖形化管理介面,可以直接使用Oracle官方提供的SQL Developer,就不需要再按照本篇文章的方式使用Oracle Instant Client。透過下列網址可以取得SQL Developer:

https://www.oracle.com/database/sqldeveloper/

安裝缺少的套件

Oracle Instant Client所依賴的套件可以先用以下指令來安裝。

Debian或其衍生的Linux發行版:

sudo apt libaio1

紅帽系的Linux發行版:

sudo dnf install libaio

Oracle Instant Client 下載與設置

以下是Oracle Instant Client官網下載頁面的網址:

https://www.oracle.com/database/technologies/instant-client/downloads.html

因為現在我們是要在Linux上使用,所以要選擇Linux版的Oracle Instant Client。

在Oracle Instant Client for Linux的下載頁面會看到很多項目可以下載,我們要下載Basic Package (ZIP)

然後在一個您覺得可以的目錄中解壓縮出壓縮檔內的目錄。筆者習慣放置在/opt/odb中,所以此時的Oracle Instant Client的根目錄就會是/opt/odb/instantclient_21_8(以21.8版本為例)。

/etc/profile中設定需要用到的環境變數,如下:

export ORACLE_HOME="/opt/odb/instantclient_21_8"
export LD_LIBRARY_PATH="$ORACLE_HOME:$LD_LIBRARY_PATH"

export TNS_ADMIN="$ORACLE_HOME/network/admin"

export PATH="$ORACLE_HOME:$PATH"

如此一來您的作業系統環境就有最基本的Oracle資料庫的客戶端能用了!如果有tnsnames.ora檔案請放置在TNS_ADMIN環境變數所指的目錄之下。TNS_ADMIN環境變數可以不用設定,不設定的話通常就會被當作是用$ORACLE_HOME/network/admin目錄。不過為了避免有些應用程式是直接去讀取TNS_ADMIN環境變數,還是設定一下比較保險。

SQL*Plus

如果您需要一個CLI的工具來下SQL敘述管理Oracle資料庫,請在Oracle Instant Client for Linux的下載頁面下載SQL*Plus Package (ZIP)項目並解壓縮,將解壓縮出來的目錄與Basic Package (ZIP)解壓縮出來的目錄合併在一起即可。

此後就可以使用sqlplus指令來操作Oracle資料庫。

oracle-instant-client

在 Docker 容器中使用 Oracle Instant Client

Node.js映像加上Oracle Instant Client

Dockerfile撰寫方式如下:

FROM node:18-slim

RUN apt update && apt install -y wget unzip libaio1 \
    && apt clean && rm -rf /var/lib/apt/lists/*

# Oracle Instant Client
RUN wget https://download.oracle.com/otn_software/linux/instantclient/218000/instantclient-basic-linux.x64-21.8.0.0.0dbru.zip -O instantclient.zip \
    && mkdir -p /opt/odb \
    && unzip instantclient.zip -d /opt/odb \
    && rm instantclient.zip
ENV ORACLE_HOME="/opt/odb/instantclient_21_8"
ENV LD_LIBRARY_PATH="$ORACLE_HOME:$LD_LIBRARY_PATH"
ENV TNS_ADMIN="$ORACLE_HOME/network/admin"
ENV PATH="$ORACLE_HOME:$PATH"

# ...

至於Node.js的alpine版本的映像,筆者就不建議在那上面使用Oracle Instant Client了。因為Oracle官方根本沒支援alpine,不要為了讓映像更輕巧卻增加潛在的問題。