выборка нескольких наборов результатов из хранимой процедуры mysql в rails - PullRequest
5 голосов
/ 09 ноября 2010

Я искал советы по этому вопросу, и пока мне не повезло. При использовании gem mysql2 при попытке выполнить хранимую процедуру, которая возвращает несколько наборов результатов, я не могу вернуть результаты в этой контекстной ошибке. Я обнаружил, что кто-то предложил использовать гем MySQL вместо этого (который я не могу найти объяснения того, что отличается между этими двумя и что я мог бы встретить при переключении), и с этим у меня был больший прогресс.

Вот что у меня есть:

>> db = ActiveRecord::Base.connection.raw_connection
=> #<Mysql:0x1056ae3d8>
>> ActiveRecord::Base.connection.select_all("CALL p_rpt_test('', '');")
=> [{"Header"=>"Client,Project,Type,Due Date,Assigned To"}]
>> db.more_results?
=> true
>> db.next_result
Mysql::Error: Commands out of sync; you can't run this command now
        from (irb):3:in `next_result'
        from (irb):3

Кто-нибудь знает, как заставить это работать, с помощью mysql2 или mysql gems? Приложение запускает рельсы 3.0.1.

Ответы [ 2 ]

5 голосов
/ 11 ноября 2010

Хорошо, я так и не понял, как заставить AR сделать это, поэтому я просто перешел на низкий уровень и использовал сам драйвер mysql, который в основном работает ...

data = Array.new
db = ActiveRecord::Base.connection.raw_connection
header = db.query("CALL #{self.proc}(#{args});")
header.each {|r| data << r}
if db.next_result
  rows = db.store_result
  rows.each {|r| data << r}
end

ActiveRecord::Base.connection.reconnect!

Это работает, но я не могу представить, что нет лучшего способа. Кроме того, я должен переподключиться после этого, или я получаю ошибку при следующем запросе, и я не нашел способа правильно закрыть сеанс. Да, и я должен использовать драгоценный камень mysql, а не mysql2.

Grrrrr.

0 голосов
/ 09 мая 2017

Мы можем использовать header.to_hash, чтобы получить массив хэша, или header.rows, чтобы получить массив массива.

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...