Я цитирую часть ответа, который я получил по другому вопросу :
В мире PHP / MySQL я бы сказал, что хранимые процедуры не идут
- PHP: вызов хранимой процедуры MySQL с параметрами INPUT AND OUTPUT (НЕ «INOUT»)
- Должны ли разработчики PHP использовать хранимые процедуры MySQL?
- Хранимые процедуры, MySQL и PHP
- Сохраненная процедура вызывает «Команды не синхронизированы» в следующем запросе
- MySQL Итерации через элементы разделенной строки и делать с ними вещи
Я хотел бы знать: это так? Зачем? Почему нет?
[edit] Я имею в виду это как общий вопрос без особой необходимости [/ edit]
Я разрабатываю и поддерживаю большое приложение PHP / MySQL. Вот мой опыт работы с хранимыми процедурами.
Со временем наше приложение стало очень сложным. И со всей логикой на стороне php некоторые операции будут запрашивать базу данных с более чем 100 короткими запросами.
MySQL настолько быстр, что производительность по-прежнему приемлема, но не велика.
Мы приняли решение в нашей последней версии программного обеспечения переместить часть логики на хранимые процедуры для сложных операций.
Мы достигли значительного прироста производительности из-за того, что нам не приходилось отправлять данные назад и вперед между PHP и MySQL.
Я согласен с другими плакатами здесь, что PL / SQL не является современным языком и его трудно отлаживать.
Bottom Line: Хранимые процедуры – отличный инструмент для определенных ситуаций. Но я бы не рекомендовал их использовать, если у вас нет веских оснований. Для простых приложений хранимые процедуры не стоят проблем.
При использовании хранимых процедур с MySQL вам часто придется использовать интерфейс mysqli в PHP, а не обычный интерфейс mysql .
Причина этого связана с тем, что хранимые процедуры часто возвращают более 1 набора результатов. Если это так, API mysql не сможет справиться с этим, и вы получите ошибки.
Интерфейс mysqli имеет функции обработки этих нескольких наборов результатов, таких как mysqli_more_results и mysqli_next_result .
Имейте в виду, что если вы возвращаете какой-либо результирующий набор вообще из хранимой процедуры, вам необходимо использовать эти API, поскольку хранимая процедура генерирует 1 результирующий набор для фактического выполнения, а затем 1 дополнительный для каждого набора результатов, намеренно возвращенного из хранимую процедуру.
У вас есть конкретная необходимость, которая заставляет вас их рассматривать? Хранимые процедуры гораздо менее переносимы, чем «простые» SQL, поэтому люди обычно не хотят их использовать. Кроме того, написав справедливую долю PL / SQL, я должен сказать, что процедурный способ написания кода добавляет сложности, и он просто не очень современный или проверяемый. Они могут быть полезны в некоторых особых случаях, когда вам нужно оптимизировать, но я бы, конечно, подумал дважды. У Джеффа сходные мнения .
Обычно я избегаю хранимых процедур, потому что он добавляет нагрузку в базу данных, которая составляет 99% времени, что является самым большим узким местом. Добавление нового php-сервера ничто по сравнению с репликацией вашего db-файла MySQL.
Это субъективный вопрос.
Я бы лично включил все вычисления в PHP и действительно использовал MySQL в качестве таблицы.
Но, если вы чувствуете, что проще использовать хранимые процедуры, то непременно сделайте это.
Я бы не сказал, что «хранимые процедуры – это не-go», я бы сказал: «Не используйте их без уважительной причины».
Хранимые процедуры MySQL имеют особенно ужасный синтаксис (Oracle и MSSQL тоже довольно ужасны), поддерживая их, просто усложняет ваше приложение.
Используйте хранимую процедуру, если у вас есть реальная (измеримая) причина для этого, иначе нет. Это мое мнение.
Вероятно, существует фобия хранимых процедур с mysql, отчасти из-за того, что они не являются чрезвычайно мощными (по сравнению с Postgresql и даже MSSQL, хранимые процедуры mysqls значительно отсутствуют).
О плюсе: они упрощают общение с ним с нескольких языков.
Если кто-то заявляет, что « использование хранимых процедур является плохим, потому что оно не переносится в разные базы данных », то это, конечно, означает, что они думают, что вы, вероятно, переключите базы данных, а это означает, что они, в свою очередь, говорят, что считают, что вы не должны использовать mysql.
Популярно использовать ORM в эти дни, но я лично считаю, что ORM – это BadThing ( вопрос: 82882 )
Я думаю, что использование хранимых процедур может предложить некоторую абстракцию в некоторых приложениях, как и в любом месте, где вы бы использовали один и тот же кусок кода SQL для обновления или добавления тех же данных, тогда вы могли бы создать один sproc save_user ($ attr ….. ), скорее, повторяя себя повсюду.
Согласованный синтаксис волосатый, и если вы привыкли к MSSQL и spaccs oracle, есть различия, которые могут разразиться.
Вы также должны знать, что хранимые процедуры не поддерживались в Mysql до версии 5.0. http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html Также хранимые процедуры, как правило, были немного странными в этой реализации. Теперь, когда Mysql 5.1 начинает появляться в дикой природе, я вижу больше использования хранимых процедур с Mysql.
Я делаю ограниченное использование хранимых процедур, и он работает хорошо. Я ведущий разработчик для одного из моих клиентов, работающих на своем сайте электронной почты. Клиент имеет систему запаса, мы реализовали набор хранимых процедур в своей системе и создали API для связи с ним. Это позволило нам абстрагировать свою базу данных, и они могли реализовать логику в хранимых процедурах. Простой, но удовлетворен бизнес-требованиям очень хорошо.