Oacle SQL DeveloperでSQL Serverのtext型データをエクスポートするときの注意点

# はじめに

Oracle SQL Developerでは「jTDS」というJDBC Driverを用いて、SQL Serverに接続することが可能です。

>参考
【Oracle SQL Developer】で【Microsoft SQL Server 2014】に接続する。 | 電気通信主任技術者 工事担任者 AI/DD 総合種　
https://www.den-tsu.net/sqldev/

jTDSを利用すれば、SQL DeveloperでSQL Serverのテーブルをエクスポートすることも可能となります。

しかし、text型データについては注意が必要で、デフォルト設定のままエクスポートすると、CLOB型として取得されてしまい、値が軒並み
`net.sourceforge.jtds.jdbc.ClobImpl@12ab34cd56`
などとなってしまいます。

ここではその解消手順を紹介します。

# 環境

SQL Developer 18.1.0.095
SQL Server 2016
jTDS 1.3.1

# 解消方法

前提として、jTDSはサードパーティJDBCドライバに登録済みであることを想定しています。
導入手順は上記リンクをご参考に。

## 1. SQL Developer上でSQL Serverの接続を作成

JDBCデータソースの修正を行う際、接続情報が既に登録されていたほうが修正しやすいので先に接続を作成・保存しておきます。
![setsuzoku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228489/1e46140d-c671-0c0f-f843-431eb153229d.png)

## 2. JDBCデータソースを修正

SQL ServerのJDBCデータソースは、
`C:\Users\<ユーザ名>\AppData\Roaming\SQL Developer\systemXX.X.X.XXX.XXXX\o.jdeveloper.db.connection`
の配下に「connections.xml」として保存されています。

( 今回私の使用したバージョンではxmlファイルでしたが、新しいバージョンでは
connections.jsonファイルになっているようです。jsonファイルであっても同様の方法で解消可能です。)

connections.xmlファイルをバックアップした上でエディタでconnections.xmlファイルを開きます。
前段の手順で作成したSQL Serverの接続情報が登録されているはずです。

```xml:before
   <Reference name="SQLSERVER-TEST" className="oracle.jdeveloper.db.adapter.DatabaseProvider" xmlns="">
      <Factory className="oracle.jdevimpl.db.adapter.DatabaseProviderFactory1212"/>
      <RefAddresses>
         <StringRefAddr addrType="customUrl">
            <Contents>jdbc:jtds:sqlserver://192.168.101.101:1433/</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="hostname">
            <Contents>192.168.101.101</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="driver">
            <Contents>net.sourceforge.jtds.jdbc.Driver</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="port">
            <Contents>1433</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="subtype">
            <Contents>SQLServer</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="SavePassword">
            <Contents>false</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="RaptorConnectionType">
            <Contents>Microsoft SQL Server</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="user">
            <Contents>sa</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="ConnName">
            <Contents>SQLSERVER-TEST</Contents>
         </StringRefAddr>
      </RefAddresses>
   </Reference>
```
この
`<Contents>jdbc:jtds:sqlserver://192.168.101.101:1433/</Contents>`
部分に下記の修正を加えます。
`<Contents>jdbc:jtds:sqlserver://192.168.101.101:1433/;useLOBs=false;</Contents>`
データベースを指定している場合は
`<Contents>jdbc:jtds:sqlserver://192.168.101.101:1433/master;useLOBs=false;</Contents>`
のようになります。


```xml:after
   <Reference name="SQLSERVER-TEST" className="oracle.jdeveloper.db.adapter.DatabaseProvider" xmlns="">
      <Factory className="oracle.jdevimpl.db.adapter.DatabaseProviderFactory1212"/>
      <RefAddresses>
         <StringRefAddr addrType="customUrl">
            <Contents>jdbc:jtds:sqlserver://192.168.101.101:1433/;useLOBs=false;</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="hostname">
            <Contents>192.168.101.101</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="driver">
            <Contents>net.sourceforge.jtds.jdbc.Driver</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="port">
            <Contents>1433</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="subtype">
            <Contents>SQLServer</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="SavePassword">
            <Contents>false</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="RaptorConnectionType">
            <Contents>Microsoft SQL Server</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="user">
            <Contents>sa</Contents>
         </StringRefAddr>
         <StringRefAddr addrType="ConnName">
            <Contents>SQLSERVER-TEST</Contents>
         </StringRefAddr>
      </RefAddresses>
   </Reference>
```
修正が完了したら、上書き保存をします。

## 3. SQL Developerを再起動

修正後のデータソースを読み込ませるためSQL Developerを再起動します。

正しく設定されている場合、接続の際 [データベースの取得] 欄に`;useLOBs=faluse`という文言が追加されているはずです。
![setsuzoku2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228489/4a680d23-932d-5042-60a2-00f62f304bbc.png)
接続後、再度エクスポートをし、TEXT型の値が正しく取得できるようになったことを確認してみましょう。

# おわりに

SQL Server上のデータベースをOracle Databaseに移行する案件があったので、SSMSを使ってみたり、sqlcmdを使ってみたり、bcpを使ってみたり、色々と試行錯誤をしていました。

その中でSQL Developerは、エクスポート時のデリミタや囲い文字、行の終端文字に拡張性があったため本格調査をしてみたところ、今回の問題にぶつかったので備忘録としてQiitaに残してみました。