Oracle Database 21c からDBLINK でCData ODBC Driver を使ってみる (Linux 編)

by 大川智久 | 2022年12月09日

こんにちは、CData Software Japan の大川です。 この記事は、Qiita CData Software Advent Calendar 2022 9日目の記事になります。Oracle Database では、「Database Gateway for ODBC」という機能を使ってDBLINK からODBC ドライバ経由でOracle 以外のデータへアクセスすることができます。この機能とCData のODBC ドライバを使って、DBLINK でSaaS 上のデータにアクセスすることが可能です。

前回はWindows Server 上でDBLINK 経由でkintone のデータにアクセスする手順を試しましたが、今回はLinux 上でOracle Database 21c のインストールからDBLINK 経由でSalesforce のデータにアクセスするまでの手順について解説します。

Oracle Database 21c について

Oracle Database 21c は「Innovation Release」と呼ばれるもので、LTS (Long Term Support) 版と比べてサポート期間が短いリリースです。そのため、このリリースを本番系として使うことは少ないと思います。しかし、今後Oracle Database の機能がどのようになっていくのかを確認するのには適しています。

今回は、このリリースとCData Salesforce ODBC Driver を使い、DBLINK 経由でSalesforce のデータへアクセスしてみます。

Oracle Database 21c のLinux へのインストール

Oracle Database 18c から、「イメージベース」と呼ばれるインストーラ形式となっています。それ以前はインストーラのzip ファイルを任意のディレクトリに展開してrunInstaller を実行するという手順でしたが、イメージベースのインストーラではzip ファイルをORACLE_HOME ディレクトリに展開しておいてrunInstaller を実行する、という手順となります。

今回はインストールを簡単にするためOracle Linux 8 とOracle Preinstallation RPM を使用します。

まずOracle Preinstallation RPM をインストールします。以降、「user%」プロンプトはwheel グループの(sudo コマンドを利用可能な)ユーザ、「oracle%」プロンプトはoracle ユーザ、「root#」プロンプトはroot ユーザでの操作を示すこととします。

user% sudo yum install oracle-database-preinstall-21c.x86_64

するとoracle というOS ユーザが作成されます。イメージベースファイルを展開するディレクトリを作成し、適切な所有者・パーミッションを設定します。

user% sudo mkdir -p /u01/app/oracle/product/21.3.0/dbhome_1
user% sudo chown -R oracle:oinstall /u01/app
user% sudo chmod -R 775 /u01

oracle ユーザにパスワードを設定してログインしなおし、以降はoracle ユーザで作業します。

user% sudo passwd oracle

作成した「/u01/app/oracle/product/21.3.0/dbhome_1」ディレクトリにインストーラのzip ファイルを転送しておき、oracle ユーザで展開します。

oracle% cd /u01/app/oracle/product/21.3.0/dbhome_1/
oracle% unzip <インストーラのzipファイル>

展開されたrunInstaller スクリプトを実行してインストーラを起動します。

oracle% LANG=C ./runInstaller

今回も簡単のため、「Create and configure a single instance database」を選択して、インストーラ上でDB やリスナも作成します。主な設定項目は以下です。

  • System class: Desktop class
  • Oracle base: /u01/app/oracle
  • Global database name: orcl
  • Pluggable database name: orclpdb

インストールが終わったら、oracle ユーザの.bashrc ファイルに以下の設定を追記します。

# User specific aliases and functions
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/21.3.0/dbhome_1
export NLS_LANG=American_Japan.AL32UTF8
export PATH=${ORACLE_HOME}/bin:${PATH}

追記した内容を以下のように有効化します。

oracle% source .bashrc

これでsqlplus が使用できるようになりますので、以下のようにテストに使うユーザを作っておきます。

oracle% sqlplus / as sysdba
...
SQL> alter session set container=orclpdb;

Session altered.

SQL> create user testuser identified by testuser quota unlimited on users;

User created.

SQL> grant connect,resource,create view,create database link to testuser;

Grant succeeded.

CData Salesforce ODBC Driver のインストール

CData Salesforce ODBC Driver は30 日間機能の制限なく試用可能です。以下のダウンロードリンクから「ダウンロード 評価版」をクリックしてインストールします。

Download ODBC Driver for Salesforce & Force.com. 30-Day Free Trial (cdata.com)

ダウンロードしたらサーバに転送しておきます。以下のように依存ライブラリをインストールした後、ダウンロードしたパッケージをインストールします。

user% sudo yum install libstdc++ zlib libgcc unixODBC unixODBC-devel
user% sudo rpm -ihv SalesforceODBCDriverforUnix.rpm

インストールしたら、以下のように評価版ライセンスをアクティベートします。

user% cd /opt/cdata/cdata-odbc-driver-for-salesforce/bin
user% sudo ./install-license.sh

その後、「/etc/odbc.ini」ファイルのシステムDSN の設定をしておきます。以下のような内容になります。

[CData Salesforce Sys]
Driver=CData ODBC Driver for Salesforce
Password=<パスワード>
Security Token=<セキュリティトークンの値>
User=<ユーザ名>
Use Sandbox=false
Maximum Column Size=4000
Include Dual Table=True
Upper Case Identifiers=True

設定をしたら、isql コマンドでクエリが実行できることを確認しておきます。

user% isql -v "CData Salesforce Sys" -m32
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select Id,Name from Account limit 5;
+-------------------+---------------------------------+
| Id                | Name                            |
+-------------------+---------------------------------+
| 0017F00004kl0oxQAA| test1                           |
| 0017F00004kl0qAQAQ| test2                           |
| 0017F00000iPW5fQAG| test3                           |
| 0017F00000iPW5dQAG| test4                           |
| 0017F00000iPW5eQAG| test5                           |
+-------------------+---------------------------------+
SQLRowCount returns -1
5 rows fetched
SQL> quit

上記のようにAccount テーブルがクエリできれば成功です。

Database Gateway for ODBC の設定

次に、Database Gateway for ODBC の設定を行います。今回は、リスナが「salesforce」というSID 経由でSalesforce ODBC Driver を使用するように設定します。

まず、「/u01/app/oracle/homes/OraDB21Home1/hs/admin/」ディレクトリに「initsalesforce.ora」というファイルを以下のような内容で作成します。

HS_FDS_CONNECT_INFO = "CData Salesforce Sys"
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1
HS_NLS_NCHAR = UCS2
set ODBCINI = /etc/odbc.ini

ここで、「HS_LANGUAGE」や「HS_NLS_NCHAR」の設定が無いとクエリを実行しようとしても以下のようなエラーになったり、クエリ結果の日本語が化けたりしますので注意してください。

ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[

次に、「/u01/app/oracle/homes/OraDB21Home1/network/admin/listener.ora」ファイルに以下のように、Database Gateway for ODBC 用に「SID_LIST_LISTENER」の設定を追加します。

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = salesforce)
      (ORACLE_HOME = /u01/app/oracle/product/21.3.0/dbhome_1)
      (PROGRAM = dg4odbc)
    )
  )

最後に、「/u01/app/oracle/homes/OraDB21Home1/network/admin/tnsnames.ora」に接続のためのTNS 名を追加します。以下の記載を追加します(HOST の値はサーバのIP アドレスもしくはホスト名としてください)。

salesforce =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=172.XX.XX.XX)(PORT=1521))
    (CONNECT_DATA=(SID=salesforce))
    (HS=OK)
  )

これで設定は完了です。リスナを再起動し、設定を反映させます。

oracle% lsnrctl stop
oracle% lsnrctl start

DBLINK の設定

ここまできたら、あとはSQL Developer から接続してDBLINK の設定をします。以下のように設定して「テスト」ボタンで「ステータス: 成功」と出ることを確認し、「接続」ボタンで接続します。

接続したら、以下のようにDBLINK を作成します。なお、ここでID やパスワードに使用している値(「foo」や「bar」)は何でも構いません。実際のSalesforce への接続にはシステムDSN (/etc/odbc.ini)で設定した情報が使用されます。

CREATE DATABASE LINK salesforcedblink CONNECT TO foo IDENTIFIED BY bar USING 'salesforce';

作成したら、早速Salesforce のデータをクエリしてみましょう。

SELECT id,name FROM account@salesforcedblink;

うまくOracle Database からSalesforce のデータをクエリできました!

さいごに

今回はOracle Database 21c からCData Salesforce ODBC Driver を使ってDBLINK 経由でSalesforce のデータをクエリしてみました。

CData Salesforce ODBC Driver は今回ご紹介したSalesforce をはじめ250 種類以上のデータソースに対応しており、すべて30 日間機能無制限で試用可能です。是非お試しいただければと思います!

CData Software Japan - ODBC Drivers

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。