2017-04-24 9 views
0

このOracleのバルク挿入をpostgresに相当するものに再実装しようとしています。PostgreSQLのOracleバルク挿入と同等のもの

は、現在持っている:ActiveRecordの/ postgresのを使用して同様の実装がどのように見えるか

  a.each do |b| 
      params << [nil, b.value] 

      inserts << %{INSERT INTO table(a, b, c, d) 
      VALUES (:a1, :a2, :a3, :a4); } 

      end 

      sql = inserts.join 
      ActiveRecord::Base.transaction do 
      # insert 
      ActiveRecord::Base.connection.exec_update(sql, 'table', params) 
      end 

私は以下のエラーに

ActiveRecord::StatementInvalid: 
    # ERROR: syntax error at or near ":" 
    # LINE 4:     VALUES (:a1, :a2, :a3, :a4, :a5, :a6, :a7, :... 
    #         ^

答えて

1

を取得していますPostgreSQLは、パラメータプレースホルダの構文$1$2などを使用しています。オラクル:a1:a2、... $1$2と、...

SQLがあなたの代わりに実際の値のプレースホルダと声明を供給プリペアドステートメントの概念を持っているを交換してください。そのたびにパラメータを1回以上ステートメントを実行して実行することができます。これは、サーバーがクエリを一度解析、分析、計画するだけで済むため、より効率的です。

あなたのコメントに答えて、複数のINSERTステートメントを連結した文字列を準備しているようです。代わりに、1つの文を用意するだけで、パラメータの各行に対して1回、複数回実行する必要があります。

残念ながら、達成するためにコードを書き直す方法を提案するには、残念ながらActiveRecordやRubyについて十分に知りません!

ところで、これは私が「バルクインサート」と呼ぶものではありません。 postgresqlにデータを取得する最も速い方法は、通常COPYコマンドです。

+0

驚くばかりです。これはうまくいった。今問題は "params"に複数の行があることです。 ActiveRecord :: Base.connection.exec_update(sql、 'table'、params) postgressql/activerecordの一括挿入を同様の方法で実装する最も良い方法は何ですか? – Water223

+0

PG :: SyntaxError:ERROR:プリペアドステートメントに複数のコマンドを挿入できません :INSERT INTO – Water223

+0

@ Water223詳細を更新しました。 – harmic

関連する問題