SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.05.2010 13:42:58

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Потеря части return-а при выполнении хранимой процедуры

Добрый день.

Есть функция, возвращающая имя-отчество клиента (2 слова через пробел).
Она берет ФИО, ищет И и О и возвращает их, отсекая фамилию. Ничего особого.

Вопрос следующий:
при выполнении её напрямую на сервере (через ssh, скажем), она возвращает в result правильное значение (т.е. "Имя Отчество").

Когда выполняешь тот же запрос через связку php+mysql, и делаешь $db->sql_fetchrow(), в значении пропадает отчество, т.е. возвращается только "Имя" (видимо, строка до пробела). С другими подобными значениями проблем нет, всё возврщается как надо.
Никакие set charset/collation, cast(get_user_io() as char()) дела не меняют.

Подскажите, пожалуйста, в какую сторону можно смотреть в данном случае.

Неактивен

 

#2 20.05.2010 13:52:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Потеря части return-а при выполнении хранимой процедуры

Видимо, все-таки, какие-то куски кода надо показать, потому как обычно
такого не бывает. Я бы рекомендовал попробовать сделать этот запрос
через обычный mysql_query и посмотреть, в связке ли дело. Очень большое
подозрение на Вашу обвязку PHP.

Неактивен

 

#3 20.05.2010 17:17:04

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

Код:
$rr=$db->sql_query("select get_user_io(532) as x,'Иван Иванович' as x2");
$r=$db->sql_fetchrow($rr);
print "<pre>"; print_r($r); print "</pre><br>";

unset($r);
$rr=mysql_query("select get_user_io(532) as x,'Иван Иванович' as x2");
$r=mysql_fetch_assoc($rr);
print "<pre>"; print_r($r); print "</pre>";

в классе $db sql_fetchrow - ничего особенного, обычный mysql_fetch_assoc внутри

---
результат:
Array
(
    [x] => Валерий
    [x2] => Иван Иванович
)

Array
(
    [x] => Валерий
    [x2] => Иван Иванович
)

--

в то же время, если делать тот же запрос при прямом подключении к mysql серверу, результат "Валерий Валерьевич", т.е. именно то, что функция и возвращает.

Вот я и не могу понять, почему после пробела съедается возвращаемое функцией значение

Отредактированно Валерий (20.05.2010 17:27:16)

Неактивен

 

#4 20.05.2010 17:28:42

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

Понятно, что можно в принципе поменять одну функцию на две, get_user_name() и get_user_otch(), и делать просто concat(), но интересен сам факт очень странного "прикола"

Неактивен

 

#5 20.05.2010 18:58:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Потеря части return-а при выполнении хранимой процедуры

Хм. А код get_user_io?

Неактивен

 

#6 21.05.2010 09:47:33

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

Функция:
create definer=`database`@`%` function `get_user_io`(user_id int) returns varchar(255) charset cp1251
begin
    call get_userio(user_id,@user_io);
    return @user_io;
    end$$


ХП:
create definer=`database`@`%` procedure `get_userio`(in user_id int, out user_io varchar(250) charset cp1251)
select if(t2.name is not null,concat(if(instr(substring(t1.name,instr(t1.name,' ')+1,200),t2.name)=1 and substring(reverse(substring(t1.name,instr(t1.name,' ')+1,100)),1,3) in ('анв','чив'),trim(substring(t1.name,instr(t1.name,' ')+1,100)),t2.name)),t1.name) into user_io from database_user t1
left join database_names_base t2 on t2.name=trim(substring(substring(t1.name,instr(t1.name,' ')+1,100),1,if(instr(substring(t1.name,instr(t1.name,' ')+1,100),' ')!=0,instr(substring(t1.name,instr(t1.name,' ')+1,100),' '),100)))
where t1.id=user_id$$

Неактивен

 

#7 21.05.2010 16:01:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Потеря части return-а при выполнении хранимой процедуры

Ничего себе процедурка smile А почему не в функции сразу?

У пользователя 532, случаем, t2.name не NULL? smile

Неактивен

 

#8 21.05.2010 16:31:46

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

Нет, там значение "Иванов Валерий Валерьевич", простой varchar.
В процедуре ничего особого - просто много instr и substring, а по сути, берётся часть строки.

И Имя Отчество она возвращает исправно, но отчество куда-то теряется.

По-поводу функции - без ХП будет быстрее работать?
Можете написать любой пример функции, которая возвращает несколько значений прямо из запроса?

Неактивен

 

#9 21.05.2010 16:53:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Потеря части return-а при выполнении хранимой процедуры

Ну, быстрее, наверное, нет, но просто странная последовательность.

Функция возвращает одно значение. Но в Вашем случае оно ведь одно?

Честно не знаю, почему так. Видимо, MySQL отрабатывает исправно, а
обрезается уже со стороны PHP. Но почему обрезается — ума не приложу.

Я бы попробовал:
1. Использовать какой-то другой клиент (perl, python, etc), чтобы определить,
что ошибка не в libmysqlclient, а точно в php.
2. В php попробовал бы использовать mysqli, если под $db лежит обычный
mysql_connect, или, соответственно, наоборот smile — возможно, другая реализация
отработает нормально.

Неактивен

 

#10 21.05.2010 18:22:55

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

Часть 1:
$res=$mysqli->query("select get_user_io(532) as x,'Иван Иванович' as x2");
while ($row = $res->fetch_assoc()) {
   printf ("%s // %s\n", $row["x"], $row["x2"]);
}
$res->close();

результата не принесла, на выходе "Валерий // Иван Иванович"

Попробую, наверное, через perl.
Давно можно было решить вопрос какими угодно изменениями, но сейчас уже просто из принципе интересно, в чём именно прикол.

Неактивен

 

#11 21.05.2010 18:25:57

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

paulus написал:

Ну, быстрее, наверное, нет, но просто странная последовательность.

Функция возвращает одно значение. Но в Вашем случае оно ведь одно?

Да, у меня одно. Просто так как-то исторически повелось, что делаю ХП, её результат запрашивает функция, и уже через select отдаёт.

Если можете написать как напрямую можно вернуть из запроса в функции возвращаемое внутренним запросом значение - буду благодарен smile Я просто не в курсе такого синтаксиса, к сожалению.

Неактивен

 

#12 21.05.2010 19:22:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Потеря части return-а при выполнении хранимой процедуры

Код:

[celestia] root test > create function test () returns int return (select 1);
Query OK, 0 rows affected (0.00 sec)

[celestia] root test > select test();
+--------+
| test() |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

Расскажите, работает ли в perl. Интересно, что случилось.

Неактивен

 

#13 22.05.2010 14:00:32

Валерий
Участник
Зарегистрирован: 20.05.2010
Сообщений: 8

Re: Потеря части return-а при выполнении хранимой процедуры

По функции - спасибо, ясно. Сделал без ХП, ничего от этого не изменилось.
Запустил ещё тот же скрипт на php на машине IIS - результат тот же, что и на Apache. Или библиотека у них одинаковая, либо дело вообще не в ней.

Чуть-чуть позже попробую через perl.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson