Кстати, встроенные процедуры в MySQL для управления доступом - рулезная вещь!!
Допустим в PHP у нас есть группы пользователей: админы, продавцы, покупатели.
Аналогично на MySQL сервере создаем юзеров: admin, seller, buyer (через них мы будем делать соединение к БД).
На странице "Годовой отчет" каждому нужно получить разную информацию.
Но PHP вызывает один тот же SQL запрос для всех!
Допустим: CALL get_report();
Наша процедура get_report() внутри проверяет через какого юзера сделано соединение к БД и выдает нужные данные.
см. SELECT USER();
Так как каждый захочет фильтровать/сортировать данные как ему захочется, процедура должна принять много параметров:
CALL get_report(здесь, очень, много, параметров)
Как этого можно избежать:
Процедура не выдает RESULTSET, а создает временную таблицу, см. CREATE TEMPORARY TABLE.
Пользователь может выбрать данные из временной таблицы.
Хитрость:
Что бы наделить пользователя привилегиями на чтение из временной таблицы:
1. сначала создаем обыкновенную пустую таблицу с таким же названием.
2. наделяем привилегиями
3. удаляем таблицу
Временные таблицы содаются отдельно для каждого соединения с БД.
Так что потери данных (при возникновении двух одинаковых таблиц) быть не должно.
------------------
Увы, в MySQL приходится иметь дело с временными таблицами (в глобальном пространстве), т. к. язык не предусматривает передачу данных другими средствами (например массивом).
Я проблем тут не вижу:
- писать в SQL процедурах всю бизнес-логику нет смысла и даже вредно.
- ИМХО временные таблицы помощнее массивов (учитывая язык запросов).
Так что для своих целей PL/SQL очень даже.