質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

4回答

767閲覧

Rails5: Oracle DBに対してgem activerecord-importを使用してbulk insertは実現可能かどうか

lolohacker

総合スコア31

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2019/02/12 09:15

編集2019/02/25 08:05

実現したいこと

rails5でoracle dbに対し、gem activerecord-importを使用してbulk insertを試してみましたが、
insertクエリが複数個流れてしまいます。下記のような状態です。

INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム) INSERT INTO "USERS" ("ID", ...以降その他カラム) VALUES (users_seq.nextval, ...以降その他カラム)

これを1つのINSERTとして実行することは可能でしょうか?
もしご存知の方いらっしゃいましたら、恐れ入りますがご教示お願い致します。
実現不可の場合はその旨記載していただけると助かります。

発生している問題と試したこと

以下のソースで

ruby

1 Users.import users_array

※users_arrayは
[
{id: 1, user_name: "test1"},
{id: 2, user_name: "test2"}
]
という形式を想定しています。

Gemfileの状態が
・gem 'activerecord-import' のみ
INSERTのクエリが1文ずつ実行されてしまう。
件数は特に関係がなかった、10件でも1万件でも同じ。

・gem 'activerecord-import-oracle_enhanced' のみ
undefind method 'import' エラーとなる。

・下記の両方を記載
gem 'activerecord-import'
gem 'activerecord-import-oracle_enhanced'
undefined method `to_sym' for [#ここにカラム名がいくつか表示される#]:Array Did you mean? to_s to_set というエラーになる。

その他

git-hub activerecord-import-oracle_enhanced
を見ると、トリガの作成が必要とのことなので

plsql

1CREATE OR REPLACE TRIGGER [テーブル名]_TRG 2 BEFORE INSERT ON [テーブル名] 3 FOR EACH ROW 4BEGIN 5 IF :NEW.ID IS NULL THEN :NEW.ID := [テーブル名]_SEQ.NEXTVAL; 6 END IF; 7END; 8/

というトリガを作成しています。
⇒2019/02/13 追記:activerecord-importでbulk insertをする際にもしかして使用される?と思い上記トリガを作成した次第です。オートインクリメントをoracle側で実現するための措置であり、今回の件では不要と理解しました。ありがとうございます。

・テーブルにはIDカラムはあります。

補足情報(FW/ツールのバージョンなど)

・ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]
・Rails 5.1.5
・Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lolohacker

2019/02/12 09:34

↑の書き方を知らなかったです。申し訳ありません。修正しました。
lolohacker

2019/02/13 01:34

回答を記載いただいた方々ありがとうございます。説明が不足しているように感じたので、一部記載を修正しました。
maisumakun

2019/02/25 01:08

users_arrayの中身は何でしょうか?(モデルを投げるのか、カラムごとのハッシュなのかによっても違ってきます)
lolohacker

2019/02/25 08:00

>users_arrayの中身は何でしょうか? カラムごとのハッシュを想定しています。
guest

回答4

0

ruby

1# 下記の両方を記載 2gem 'activerecord-import' 3gem 'activerecord-import-oracle_enhanced'

activerecord-import-oracle_enhancedは、activerecord-oracle_enhanced-adapterGitHub)に依存する、とのことですが、こちらは入れられていますでしょうか。

投稿2019/02/25 08:05

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lolohacker

2019/02/25 08:07

回答ありがとうございます!入れていないです。 試してみます!
lolohacker

2019/02/25 08:46

申し訳ありません、、上記のgemは既に入れていました。。
guest

0

どんなキーワードでググりましたか?

URLで提示されたトリガーはID列がNULLだったら値を設定するだけですから的外れです。必要ないトリガーを使うと遅くなりますし。

BULK INSERT のサンプルです。
質問に、差支えない範囲でCREATE TABLE文と現行のINSERT文も提示したが適切なコメントが付き易いです。

投稿2019/02/12 10:40

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

READMEを見ると、トリガの作成が必要とのことなので

それは、オートナンバーを疑似的に処理するものです。

複数のINSERTを纏めて行う構文について、通常は以下の様な文法ですが、oracleではエラーです。

SQL

1insert into テーブル() values(),(),()

類似するものだと、oracleのマルチテーブルインサートを使用することになるので、文法は独自です。
Oracle で複数レコードを一気に INSERT する記法を毎回忘れる

投稿2019/02/12 09:48

編集2019/02/12 10:58
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

今日時点では実現不可能と思われます。
結局のところストアドプロシージャに投げるような形で処理を修正しました。

回答くださった方々ありがとうございました。

投稿2019/02/28 05:00

lolohacker

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問