Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранимая функция, возвращающая набор записей 
:(
    Опции темы
grep2
Дата 21.9.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.10.2007

Репутация: нет
Всего: нет



Нужно сделать функцию, которая возвращала бы не значение, а набор записей (одну или больше).
Функцию вызвать из php и получить этот набор от mysql.
Надеюсь, mysql 5 такое поддерживает? Как это сделать?
Спасибо.
PM MAIL   Вверх
skyboy
Дата 21.9.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



хранимая функция(cerate function) такого не может делать. только хранимая процедура(create procedure). вот только не знаю, как у PHP с вызовом хранимых процедур...
PM MAIL   Вверх
grep2
Дата 28.10.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.10.2007

Репутация: нет
Всего: нет



а если результат этого набора записей я потом хочу использовать в подзапросе?

типа ткого:

select * from users where (поле result из результата выполнения (call sp_my_proc(users.id)) = 1)

где call sp_my_proc(users.id)  возвращает запись вида:
(result, name, message)
PM MAIL   Вверх
skyboy
Дата 28.10.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



нет. 
Код

CALL sp_my_proc...

не может быть частью DML-запроса. 
процедура может вызываться либо сама по себе,  либо внутри другой процедуры.
PM MAIL   Вверх
grep2
Дата 28.10.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.10.2007

Репутация: нет
Всего: нет



Ок, я хочу использовать результат select'а, который возвращает процедура, из другой функции

как мне сделать в коде функции 

SELECT * INTO var1, var2, var3 
FROM (call sp_my_proc(users.id)) 

Чтобы далее по коду фукнции использовать полученный в переменные результат.

Надеюсь, такое возможно?

Это сообщение отредактировал(а) grep2 - 28.10.2008, 17:07
PM MAIL   Вверх
Бонифаций
Дата 28.10.2008, 17:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



Обьясните толком что вам нужно. Задача какая? не "как вернуть рекорсет из функуии" а задача? для чего вам это нужно?

В большинстве случаев необходимость возврата рекордсета обходится временной таблицей с engine=memory.






--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
grep2
Дата 28.10.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.10.2007

Репутация: нет
Всего: нет



Есть процедура. Ей передается айди двух объектов и она их сравнивает по заданному алгоритму. Результат сравнения - несколько значений. В настоящий конкретный момент это два значения.

Условно говоря мне нужно выбрать 

select * from tables, chairs 
where sp_compare(table_id, chair_id) = (>2, =7)

Т.е. число-результат сравнения больше двух, а второе число результат сравнения =7.



Это сообщение отредактировал(а) grep2 - 28.10.2008, 19:39
PM MAIL   Вверх
sir_nuf_nuf
Дата 28.10.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 8
Всего: 31



Цитата

select * from tables, chairs 
where sp_compare(table_id, chair_id) = (>2, =7)



grep2,  ну на MySQL это будет где-то так:

Код

select * from tables, chairs 
where sp_compare_part1(table_id, chair_id) >2 and sp_compare_part1(table_id, chair_id) = 7


вот.
Или еще как вариант:
Код

select * from tables, chairs 
where some_very_smart_compare_function(table_id, chair_id, 2, 7)


P.S. есть что-то работает не так как вы этого хотите, это не значит что оно работает не правильно.
Никто же не придирается, например, к синтаксису регулярок. 


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
smartov
Дата 28.10.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



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

SELECT * FROM PROCEDURE_NAME INTO AAA

PM MAIL   Вверх
sir_nuf_nuf
Дата 28.10.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 8
Всего: 31



smartov, подробнее можно ? покажите код хранимки.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
smartov
Дата 28.10.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



sir_nuf_nuf, нету у меня кода, уважаемый. Но когда последний раз мне это надо было на проекте - я спокойно использовал. Сейчас я до этого кода не достучусь
PM MAIL   Вверх
sir_nuf_nuf
Дата 28.10.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 8
Всего: 31



Цитата

SELECT * FROM PROCEDURE_NAME INTO AAA

ну это что то..  

Код

mysql> explain a;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| b     | int(11) | YES  |     | NULL    |       | 
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)


Код
mysql> create procedure zzz() 
    -> begin
    -> select * from a;
    -> end
    -> $$
Query OK, 0 rows affected (0.04 sec)


Код

mysql> select * from  zzz;    
ERROR 1146 (42S02): Table 'nuf.zzz' doesn't exist



P.S. Вообще на mysql форуме предлагают создавать временные memory - таблицы.. и например, возвращать их имя.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1043 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.