※当サイトの記事には、広告・プロモーションが含まれます。

Oracle DatabaseのテーブルにCSVファイルからのデータをINSERTする

nazology.net

⇧ amazing...

ただ、フライドポテトを食べる頻度が多いと死亡リスクが高まるとか...

diamond.jp

⇧「じゃがいも」自体が良くないってのは衝撃...

SQL*LoaderとOracle SQLcl (SQL Developer Command Line)

Oracle DatabaseのテーブルにCSVファイルからデータをINSERTする方法にはどんなものがあるのか?

公式のドキュメントによりますと、

docs.oracle.com

2.1.1 CSVファイルからのデータのインポート

Oracle SQL DeveloperまたはOracle Databaseユーティリティ(SQL*Loaderや外部表など)を使用して、CSVファイルのデータをデータベースにインポートできます。

https://docs.oracle.com/cd/F58864_01/spgdg/importing-data-csv-files.html

次に、次のステップを実行してデータをロードします。

  1. 次に示すように、bank_nodes.csvから頂点をロードするSQL*Loader制御ファイルを作成します。
load data
infile '<path_to_bank_nodes.csv>'
into table bank_accounts
fields terminated by "," optionally enclosed by '"'
( id, name )

https://docs.oracle.com/cd/F58864_01/spgdg/importing-data-csv-files.html

  1. 次に示すように、コマンドラインからSQL*Loaderを起動して、前述の構成ファイルを使用してbank_accounts表の頂点をロードします。
sqlldr <dbuser>/<password> CONTROL=<path_to_vertex_loader.ctl>

https://docs.oracle.com/cd/F58864_01/spgdg/importing-data-csv-files.html

Oracle Database特有の方法が用意されてるらしい。

何でも、「load data」コマンドってものが用意されてるよう。

なんだけど、

Enter the LOAD command to load the data from a CSV file after creating the table.

load bank_accounts bankgraphdataset/bank_accounts.csv new ;

https://blogs.oracle.com/database/post/get-started-with-property-graphs-in-oracle-database-23c-free-developer-release

Oracleの公式のブログの情報だと、「load」コマンドなるものもあるらしい。

docs.oracle.com

2.10 Loading a File

Use the LOAD command in SQLcl to load a comma-separated value file from a local directory or cloud storage location into a table.

https://docs.oracle.com/en/database/oracle/sql-developer-command-line/22.3/sqcug/loading-file.html

2.11.1 LOAD Command

Loads a comma-separated value (csv) file from a local directory or cloud storage location into a table.

Syntax 

LOAD [TABLE] [schema.]table_name { <file-specification> | <cloud-storage-specification> } 
[NEW | SHOW | SHOW_DDL | CREATE |CREATE_DDL]

https://docs.oracle.com/en/database/oracle/sql-developer-command-line/23.1/sqcug/loading-file.html

⇧ とある。

確認出来た限りの情報で整理すると、Oracle Databaseのみでしか利用できないけど、

  • SQL*Loader
    • load data
  • Oracle SQLcl (SQL Developer Command Line)
    • load

の2つの方法が用意されてるらしいですと。

他にも方法があるのかも知れないですが、相変わらず、Oracleさんのドキュメントが把握し辛いので、何とも言えませんな...

で、「Oracle SQLcl (SQL Developer Command Line)」がデフォルトで使えると思いきや、「Oracle Preinstallation RPM」でOracle Databaseをインストールしている場合は、

docs.oracle.com

3.12.11.1.1 Downloading and Installing SQLcl

Download and install Oracle SQL Developer Command Line (SQLcl) for free.

https://docs.oracle.com/en/database/oracle/apex/23.1/aeadm/downloading-and-installing-sqlcl.html#GUID-83763988-03D8-48AB-BE0E-824D84DBBF69

⇧ 別途インストールする必要があるらしい...

ちなみに、Oracleさん、

www.oracle.com

⇧ 『SQLclはSQL Developerに付属しており、SQL DeveloperはすべてのOracle Databaseのインストールに同梱されています。つまり、SQLclはOracle Databaseに付属しています。』って、また、平気で嘘を付く...

残念ながら、

oracle-base.com

⇧「Oracle Cloud Infrastructure (OCI)」以外の環境は、dnfによるインストールに対応してないっぽい。

試しに、「WSL 2(Windows SubSystem for Linux 2)」の「Oracle Linux 8.7」で試してみたところ、

⇧ 見つからないと怒られました...

Oracle SQLcl (SQL Developer Command Line)」をインストールする

致し方ないので、普通にダウンロードしてインストールするようにしました。

まずは、ダウンロード。

wget https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zip    

展開先の説明がドキュメントに無いので、展開先はどこでも良いってことかね?

とりあえず、展開。

unzip sqlcl-latest.zip

Linux環境だと「./sqlcl/bin/sql」が実行ファイルってことになるみたい。

これだと、rootユーザーでしか実行できないことになりそうなんだけど、本当に展開先どこでも良いんかね?

Oracle DatabaseのテーブルにCSVファイルからのデータをINSERTする

INSERT対象のテーブルは、

ts0818.hatenablog.com

⇧ 上記の記事で作成した「W_M_FACILITY」テーブルで。

CSVファイルを作成。

FFACILITY_CODE,FACILITY_CLASS,FACILITY_NAME,ADDRESS,TEL,CREATE_TIME,UPDATE_TIME
001,H,パークハイアット東京,163-1055東京都新宿西新宿3-7-1-2,0353221234,2023/06/11 00:00:00,2023/06/11 00:00:00
002,H,コンラッド東京,160-0023東京都新宿区西新宿2-2-1,0363888000,2023/06/11 00:00:00,2023/06/11 00:00:00
003,H,京王プラザホテル,163-1055東京都新宿西新宿3-7-1-2,0333440111,2023/06/11 00:00:00,2023/06/11 00:00:00
004,H,ホテルニューオータニ,102-0094東京都千代田区紀尾井町4-1,0332651111,2023/06/11 00:00:00,2023/06/11 00:00:00

WinSCP」で「WSL 2(Windows SubSystem for Linux 2)」の「Oracle Linux 8.7」へCSVファイルをアップロードします。

で、実行するも、

⇧ パスの問題で怒られる...

Oracle Database 23c(Free – Developer Release)で利用してるっぽい、JDKを指定してみたところ、

⇧ まさかのJava 8を使っていると...

Java 11をインストール。

dnf -y install java-11-openjdk java-11-openjdk-devel

Oracle Databaseの環境変数も設定しておく必要があったっぽい。

で、接続して、CSVファイルからINSERTしてみる。

テーブル作成済みの場合は、引数のnewが不要だったようです。

INSERTされました。

同じCSVファイルを読み込んでINSERTを試みたところ、 

一意制約エラーになりました。

もし、テーブルに主キーとか設定されていないのであれば、重複データが登録されることになるってことかね。

何と言うか、Oracleの情報は嘘情報が多いのが辛い...

一次情報が信用できないのは厳しい...

毎度モヤモヤ感が半端ない...

今回はこのへんで。