поиск:
Полезные ссылки

  • Форум по MySQL

  • Статьи по MySQL

  • Вопросы по MySQL

  • MySQL.com


  • Базы данных

  • MySQL

  • PostgreSQL


  • PHP конференция 2005
    Подробности!

    9.2.2.2. Последовательность вызова UDF для агрегатных функций

    Ниже приведено описание функций, которые необходимо определить при создании агрегатной UDF-функции.

    char *xxx_reset(UDF_INIT *initid, UDF_ARGS *args,
    		char *is_null, char *error);
    

    Эта функция вызывается, когда MySQL находит первую строку в новой группе. В функции необходимо сбросить все внутренние переменные, в которых накапливаются значения, и затем установить переданный аргумент как первый аргумент в группе.

    Во многих случаях это реализуется путем сброса всех переменных и последующего вызова xxx_add().

    char *xxx_add(UDF_INIT *initid, UDF_ARGS *args,
    	      char *is_null, char *error);
    

    Эта функция вызывается для всех строк, принадлежащих к одной группе, за исключением первой. В функции к внутренней накопительной переменной следует добавить значение UDF_ARGS.

    Функция xxx() должна быть объявлена точно так же, как это делается при определении простой UDF-функции (see Раздел 9.2.2.1, «Последовательность вызова UDF для простых функций»).

    Вызов этой функции происходит, когда все строки в группе обработаны. Обычно функция не должна обращаться к переменной args, а возвращаемое значение должно базироваться на внутренних накопительных переменных.

    Какая бы то ни было, обработка аргументов в xxx_reset() и xxx_add() должна проводиться точно так же, как для нормальных UDF-функций (see Раздел 9.2.2.3, «Обработка аргументов»).

    Организация возврата значений в xxx() эквивалентна используемой для нормальной UDF (see Раздел 9.2.2.4, «Возвращаемые значения и обработка ошибок»).

    Аргументы-указатели is_null и error одинаковы для всех вызовов xxx_reset(), xxx_add() и xxx(). Их можно использовать для запоминания того, что произошла ошибка, или когда функция xxx() должна возвращать NULL. Заметьте, что сохранять строку в *error нельзя! Это всего лишь 1-байтовый флаг!

    is_null сбрасывается для каждой группы (перед вызовом xxx_reset()). error не сбрасывается никогда.

    Если is_null или error окажется установленным после xxx(), MySQL вернет NULL в качестве результата групповой функции.

     
    © 1997-2005 PHP Club Team
    Rambler's Top100