Ошибка при вызове хранимой процедуры MySQL (которая возвращает набор результатов) из Rails 3 - PullRequest
0 голосов
/ 11 октября 2010

Я вызываю хранимую процедуру (MySQL) из моей модели. Эта хранимая процедура возвращает набор результатов, но я получаю эту ошибку ...

Mysql2 :: Ошибка: ПРОЦЕДУРА my_db.sp_venue_nearby_with_questions не может вернуть набор результатов в заданном контекст: ....

Вот код рельсов, который я использую -

connection.select_all("call sp_some_proc()")

Я также попробовал "connection.execute", но он тоже не работает. Я успешно смог вызвать другой сохраненный процесс из моей модели, но тот не возвращает набор результатов.

1 Ответ

2 голосов
/ 13 октября 2010

Я попробовал то же самое с гемом MySQL 2, который используется по умолчанию в Rails 3, и получил похожую ошибку.Проблема в том, что гем MySQL 2 по умолчанию не использует MULTI_STATEMENTS, который необходим, когда вы хотите получить набор результатов обратно из процедуры.

После некоторого исследования я решил придерживаться оригинального MySQLgem (adapter:mysql вместо adapter:mysql2 в database.yml), который, кажется, прекрасно работает и в Rails 3.

Вот что я делаю, чтобы получить результат от хранимой процедуры в классе ActiveRecord:

db = ActiveRecord::Base.connection.raw_connection
entries = Entry.find_by_sql( 'CALL sp_get_all_entries()' )

# we need to flush the result set otherwise following SQL statements cannot be processed
db.next_result if ( db.more_results? )

Теперь строки, возвращенные из хранимой процедуры, будут доступны для объектов записей, например,

entries.each do |entry|
    puts entry.name
    puts entry.extra_column_from_sp
end

Обратите внимание, что в SP можно добавить дополнительные столбцы.Эти дополнительные столбцы всегда будут иметь тип «String», поэтому вам может потребоваться преобразовать их, например, в дату.

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