2017-04-24 2 views
0

이 Oracle 대량 삽입물을 동일한 포스트그레스에 다시 구현하려고합니다.PostgreSQL과 동일한 Oracle 대량 삽입

현재 가지고 :

  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은 대신 실제 값의 자리에 문을 제공 준비된 명령문의 개념이를 교체합니다. 그런 다음 매번 매개 변수를 제공하는 명령문을 한 번 이상 실행할 수 있습니다. 이는 서버가 쿼리를 한 번 파싱, 분석 및 계획하기 때문에보다 효율적입니다.

귀하의 의견에 대한 답으로 여러 INSERT 문을 연결 한 문자열을 준비하는 것처럼 보입니다. 대신 하나의 INSERT 문만 준비한 다음 매개 변수의 각 행에 대해 한 번씩 여러 번 실행해야합니다.

불행히도 나는 그것을 달성하기 위해 코드를 재 작성하는 방법을 제안 할 수있을만큼 ActiveRecord 또는 Ruby에 대해 충분히 알지 못합니다!

그건 그렇고, 내가 '벌크 삽입'이라고 부르는 것은 아닙니다. postgresql에 데이터를 가져 오는 가장 빠른 방법은 일반적으로 COPY 명령을 사용하는 것입니다.

+0

굉장합니다. 이것은 효과가 있었다. 이제 문제는 "params"에 여러 행이 있다는 것입니다. ActiveRecord :: Base.connection.exec_update (sql, 'table', params) 비슷한 방식으로 postgressql/activerecord에 대한 대량 삽입을 구현하는 가장 좋은 방법은 무엇입니까? – Water223

+0

PG :: SyntaxError : 오류 : 준비된 명령문에 여러 명령을 삽입 할 수 없습니다. : INSERT INTO – Water223

+0

@ Water223 자세한 내용으로 업데이트했습니다. – harmic