Проблема с функцией?

monomer

Новичок
Проблема с функцией?

написал функцию
CREATE FUNCTION SYSTEM_GET_MSG(code INT) RETURNS VARCHAR(256)
BEGIN
SELECT IF(COUNT(`msg`),`msg`,'no msg') INTO @last_message_msg FROM `system_messages` WHERE `code`=code AND `language`=@language LIMIT 1;
RETURN @last_message_msg;
END

Вызываю SYSTEM_GET_MSG(1) возвращает первую запись, вызываю SYSTEM_GET_MSG(2) возвращает первую запись. Почему?
Так же почему такой код функции мне всегда возвращает NULL
CREATE FUNCTION SYSTEM_GET_MSG(code INT) RETURNS VARCHAR(256)
COMMENT 'Вытаскивает сообщение по коду'
BEGIN
DECLARE msg CHAR;
SELECT IF(COUNT(`msg`),`msg`,'no msg') INTO msg FROM `system_messages` WHERE `code`=code AND `language`=@language LIMIT 1;
RETURN msg;
END

-~{}~ 31.07.08 20:35:

помогите плиз на этой шняге остановился

-~{}~ 31.07.08 20:38:

мускуль 5ый
 

monomer

Новичок
Ответ не верный.
Даже если ты такой умный, то без лимита тоже первую запись возвращает.
Если я тело функции так пишу
SELECT `msg` INTO @last_message_msg FROM `system_messages` LIMIT 1;
RETURN @last_message_msg;
он мне возвращает опять первую запись, делаю сортировку в обратном порядке по `code` все равно ответ тот же...
 

Raziel[SD]

untitled00
Попробуй выполнить свой запрос вне процедуры, и посмотри на результат в msg.

Надеюсь это тебе поможет понять в чем ты ошибся.
 

monomer

Новичок
вне функции все работает

-~{}~ 01.08.08 15:32:

mysql> use database
Database changed
mysql> SELECT `msg` INTO @last_message_msg FROM `system_messages` WHERE `code`=1 LIMIT 1;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @last_message_msg;
+--------------------------------------------------+
| @last_message_msg |
+--------------------------------------------------+
| Логин: Ошибка при регистрации, логин существует. |
+--------------------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT `msg` INTO @last_message_msg FROM `system_messages` WHERE `code`=8 LIMIT 1;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @last_message_msg;
+------------------------------------------------------------------------+
| @last_message_msg |
+------------------------------------------------------------------------+
| Логин: Защита от подбора пароля, подождите немного и попробуйте снова. |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)

-~{}~ 01.08.08 18:44:

Ну что никто не знает чтоли???

-~{}~ 02.08.08 08:49:

а есть русско язычный оф форум? дайте линк
 

Raziel[SD]

untitled00
А вот ты это писал:
Вызываю SYSTEM_GET_MSG(1) возвращает первую запись, вызываю SYSTEM_GET_MSG(2) возвращает первую запись.
Не вижу разницы между работой в функции и вне функции.
 

monomer

Новичок
Я тоже не вижу..
Если запрос в теле переписываю на такой:
SELECT `msg` INTO @last_message_msg FROM `system_messages` WHERE `code`=1 LIMIT 1;
или такой
SELECT `msg` INTO @last_message_msg FROM `system_messages` WHERE `code`=2 LIMIT 1;
возвращает что и должен(т.е. 1 и 2 записи соответственно)
если переписать так
SELECT code INTO @last_message_msg
возвратит все верно, т.е. аргумент функции.
И где логика? или я тупой или Mysql гонит
Может я скину запросы, а вы у себя проверите?

-~{}~ 02.08.08 12:05:

вот запросы:
-----
CREATE DATABASE `database` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;
use database;
CREATE TABLE `system_messages` (
`code` INT NOT NULL AUTO_INCREMENT,
`type` ENUM('service','message','fatal') NOT NULL,
`language` CHAR(2) NOT NULL,
`msg` VARCHAR(256) NOT NULL,
PRIMARY KEY (`code`)
) ENGINE = innodb CHARACTER SET cp1251 COLLATE cp1251_bin;

INSERT INTO `system_messages` (`code`,`type`,`language`,`msg`) VALUES
(1,'message','ru','Логин: Ошибка при регистрации, логин существует.'),
(2,'message','ru','Логин: Ошибка при регистрации, ник существует.'),
(3,'message','ru','Логин: Успешно зарегестрировано, активируйте свой логин.'),
(4,'message','ru','Логин: Логина не существует.'),
(5,'message','ru','Логин: Пароль не верный. После 4 неверных попыток, включается блокировка');
delimiter //
CREATE FUNCTION SYSTEM_GET_MSG(code INT) RETURNS VARCHAR(256)
COMMENT 'Вытаскивает сообщение по коду'
BEGIN
DECLARE msg VARCHAR(256);
SELECT IF(COUNT(`code`),`msg`,'no msg') INTO msg FROM `system_messages` WHERE `code`=code LIMIT 1;
RETURN msg;
END//
SELECT SYSTEM_GET_MSG(1)//
SELECT SYSTEM_GET_MSG(3)//
SELECT SYSTEM_GET_MSG(6)//
select IF(COUNT(`code`),`msg`,'no msg') from `system_messages` WHERE `code`=1 LIMIT 1//
select IF(COUNT(`code`),`msg`,'no msg') from `system_messages` WHERE `code`=3 LIMIT 1//
select IF(COUNT(`code`),`msg`,'no msg') from `system_messages` WHERE `code`=6 LIMIT 1//
 

Raziel[SD]

untitled00
Автор оригинала: monomer
возвратит все верно, т.е. аргумент функции.
И где логика? или я тупой или Mysql гонит
MySQL выполняет запросы верно, это ты ждешь неверных результатов, делай выводы сам :)
 

monomer

Новичок
Ну хорошо, сейчас дам другой запрос

-~{}~ 02.08.08 16:12:

вот выполни его (если БД потер уже, заново создай, по тем запросам)
use database
delimiter //
DROP FUNCTION SYSTEM_GET_MSG//
CREATE FUNCTION SYSTEM_GET_MSG(code INT) RETURNS VARCHAR(256)
COMMENT 'Вытаскивает сообщение по коду'
BEGIN
SELECT IF(COUNT(`code`),`msg`,'no msg') INTO @msg FROM `system_messages` WHERE `code`=code LIMIT 1;
RETURN @msg;
END//
SELECT SYSTEM_GET_MSG(2)//
SELECT SYSTEM_GET_MSG(1)//

-~{}~ 02.08.08 16:15:

Ну и намекни что поменять что бы он нормально возвращал?(по поводу NULL) я там все менял, переменял уже. Два дня над этой фигней сижу уже..

-~{}~ 02.08.08 16:37:

И почему я жду неверных результатов, тип поля msg - VARCHAR(256), RETURNS VARCHAR(256) объявил, переменную объявил VARCHAR(256) и шо ему не нравитцо?

-~{}~ 03.08.08 14:24:

Можно я повешаюсь? Нужно просто изменить имена переменых, он, mysql, ***, думает что это столбцы(т.е. переменные)...

-~{}~ 03.08.08 14:29:

вот тут все пахает...
CREATE FUNCTION SYSTEM_GET_MSG(codeF INT) RETURNS VARCHAR(256)
COMMENT 'Вытаскивает сообщение по коду'
BEGIN
DECLARE msgF VARCHAR(256);
SELECT IF(COUNT(`code`),CAST(`msg` AS CHAR),CONCAT('No msg id#',codeF)) INTO msgF FROM `system_messages` WHERE `code`=codeF AND `language`=@language LIMIT 1;
RETURN msgF;
END
//
 
Сверху