вызов stored procedure в mysql из php

Dmitry08

В базе сделана процедура personnel_eng(IN id INT получающая параметр и выполняющая один большой select (для теста при вызове в коде

$query = "CALL personnel_eng($id)";
mysql_query($query) or die (mysql_error;

получается ответ:
PROCEDURE labwebdb.personnel_eng can't return a result set in the given context
При вызове из консоли mysql получаю ожидаемый результат. Каким образом получить результат выполнения mysql-процедуры в php?

Dmitry08

Спасибо за ссылку. В используемой мною процедуре вывод есть результат SELECT'a. Каким образом должен тогда задаваться параметр OUT? Я немножко новичёк в mysql, но не увидел типа данных array.

katrin2201

В оракле это ref cursor/ResultSet соответственно.
Как в мускуле - хз. Возможно просто второй селект который ты вызываешь после call для получения новых значений параметров вернет тебе все нужное.

Dmitry08

Разобрался уже: есть тип cursor, но работать с ним не так просто. Другой вариант: в процедуре указать параметры OUT по одному на каждое возвращаемое значение.
В общем, проще вставить этот select в тело кода. Тем более, что не уверен насчёт серьёзного увеличения производительности в случае использования хранимых процедур. Кто-нибудь может авторитетно сказать/показать что будет быстрее работать и даст меньшую нагрузку на сервер: select из нескольких таблиц с длинным where-условием вызванный непосредственно из php кода или использование процедуры с тем же селектом?

katrin2201

select из нескольких таблиц с длинным where-условием вызванный непосредственно из php кода или использование процедуры с тем же селектом?
должно быть однохуйственно

klyv

должно быть однохуйственно
если делать prepare. иначе он будет компилировать толстый запрос при каждом вызове.

Dmitry08

Я правильно понял Йорика:
Если делать prepare, то скорость одинакова, если не делать prepare, то при вызове хранимки "он будет компилировать толстый запрос" и работать с процедурой становится медленнее?

klyv

не правильно.
при первом вызове хранимки она компилится, и потом исползуется уже скомпилированная (иногда перекомпилится, когда надо).
есои ты подготовишь (prepare) пакет, он тоже скомпилируется, как и тело хранимки. после этого ты его можешь использовать так же быстро, как и хранимку, не тратя время на компиляцию. проблема возникнет только если у тебя пакет формируется динамически.

tokuchu

$query = "CALL personnel_eng($id)";
А "SELECT personnel_eng($id)" не поможет? :)
Оставить комментарий
Имя или ник:
Комментарий: