2012-12-20 3 views
3

pg gem이있는 루비에서 준비된 문을 사용하려고합니다. 이것은 내가준비된 문이 이미 있음

준비된 문 INSERT_VALUES 이미 존재하는 오류가 계속

conn.prepare("insert_values", "insert into " + objectName + "(" + headerStr + ") values (" + prep_values + ")") 
conn.exec_prepared("insert_values", arr) 

처럼 내 문 모습입니다.

어떻게 수정합니까 ?? 감사합니다

+0

예. 좋은 질문입니다. 준비된 문장의 이름을 지우거나 재사용하는 방법은 무엇입니까? – AJcodez

+2

@AJcodez는 "deallocate"문을 사용하여 지 웁니다. 이미 사용 된 이름으로 자신의 캐시를 관리하십시오. 안전한 매개 변수를 얻기 위해 준비/실행하려는 경우 익명의 준비된 문을 사용하십시오. – araqnid

답변

6

봅니다 실행 : 당신의 예에서

conn.exec("DEALLOCATE name_of_prepared_statement") 

:

conn.exec("DEALLOCATE insert_values") 

간단한 테스트 및 내 IRB에서 일하고 :

1.8.7 :001 > require 'rubygems' 
=> true 
1.8.7 :002 > require 'pg' 
=> true 
1.8.7 :003 > conn = PGconn.connect(:host => 'localhost', :port => 5912, :user => 'test', :dbname => 'test') 
=> #<PGconn:0x7fe6ac703970> 
1.8.7 :005 > conn.prepare("insert_values", "select * from data where id < $1") 
=> #<PGresult:0x7fe6ac6b2e58> 
1.8.7 :006 > conn.prepare("insert_values", "select * from data where id < $1 and id > $2") 
PGError: ERROR: prepared statement "insert_values" already exists 

from (irb):6:in `prepare' 
from (irb):6 
1.8.7 :007 > conn.prepare("insert_values", "select * from data where id < $1") 
PGError: ERROR: prepared statement "insert_values" already exists 

from (irb):7:in `prepare' 
from (irb):7 
1.8.7 :008 > conn.exec("DEALLOCATE insert_values") 
=> #<PGresult:0x7fe6ac6738c0> 
1.8.7 :009 > conn.prepare("insert_values", "select * from data where id < $1") 
=> #<PGresult:0x7fe6ac665fe0> 
1.8.7 :010 > conn.exec_prepared("insert_values",[200]) 
=> #<PGresult:0x7fe6ac65d188> 
1.8.7 :011 > conn.exec("DEALLOCATE insert_values") 
=> #<PGresult:0x7fe6ac654df8> 
1.8.7 :012 > conn.exec_prepared("insert_values",[200]) 
PGError: ERROR: prepared statement "insert_values" does not exist 

from (irb):12:in `exec_prepared' 
from (irb):12 
+0

이 문을 실행 한 후에 동일한 오류 메시지가 나타납니다. – Gaurav

+0

@ Gaurav는 irb의 간단한 테스트를 봅니다. – sufleR

0

이 더 좋은 방법의 재사용은 prepare(), 회피 prepared statement "my_statement" already exists :

sql = "select * from my_table where id = $1" 
begin 
    ActiveRecord::Base.connection.raw_connection.prepare('my_statement', sql) 
rescue PG::DuplicatePstatement => e 
end 

pg_result = ActiveRecord::Base.connection.raw_connection.exec_prepared('my_statement', [my_table_id]) 
관련 문제