среда, 25 июня 2008 г.

Решение трудностей MySQL 5 вызов процедур в PHP

Убил три дня на изучение простой вещи, надеюсь кому то поможет.

Использование Функций и Процедур в СУБД MySQL 5.0-5.1

Функция не может звозвращать значение типа TABLE или ROW и даже CURSOR, только вещественные значения такие как INT, FLOAT, CHAR и т.д. Поэтому функции лучше использовать как вспомогательные элементы к процедурам ИМХО.
"RETURN в процедуре" как оказалось существует два варианта:
Первый возвращение через параметры OUT и IN/OUT Выглядит это так:
CALL prname('INPARAM1', @a1) SELECT @a1;
На лицо недостатки метода нужно заранее знать количество необходимых параметров, что лично для меня не подходило

Второй вариант:
Вывод через процедуры такого вида:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `msgbox`(IN xid INT(11), IN xlang char(2))
BEGIN
select id, text, lang from messages where id=xid and lang=xlang limit 0, 1;
END$$

DELIMITER ;

То что надо можем вставлять любе запросы любые разветвления, алгоритмы и т.д.
Но, есть одно НО =)
А именно в моем SQLyog все работает на ура, но когда выполняю примерно так на PHP (apache/OS Win) $result = mysql_query($query, $this->db_id) ;

Возвращается ошибка

MySQL Error!
------------------------

The Error returned was:
PROCEDURE real.sel_komnat can't return a result set in the given context

Error Number:
1312

На официальном форуме, ни слова про это нет. На русском вообще тем по пальцам пересчитать можно, у буржуев советы только по выводу через параметры как в первом способе.


На самом деле все гораздо проще... Стоило только подключить библиотеку MySQLi как все заработало на ура. fetch Проходит без проблем.

Комментариев нет: