2009-10-13 3 views
1

У меня есть функция, которая возвращает строку даты. Мне нужно это, потому что я не могу использовать переменную в представлении, но я могу использовать функцию, которая возвращает переменную, которую я установил раньше времени ...mysql function if/else

Итак, у меня все получилось, но потом я решил, что если бы я хотел, чтобы он возвращал текущую дату, если не была установлена ​​переменная даты. Я думал, что этот код Уолд работы, но я получаю ошибки синтаксиса ...

DELIMITER $$ 

USE `cc`$$ 

DROP FUNCTION IF EXISTS `ox_date`$$ 

CREATE FUNCTION `ox_date`() RETURNS CHAR(50) CHARSET latin1 
DECLARE ox VARCHAR(20) 
IF @oxdate <1 THEN SET ox = CURDATE$$ 
ELSE SET ox = @oxdate$$ 

RETURN ox $$ 

DELIMITER ; 

Я попытался ISNULL на том, что первый если, но это не было какой-либо помощи.

+0

слегка изменен, но до сих пор не удается ... DELIMITER $$ USE 'cc' $$ DROP FUNCTION IF EXISTS' ox_date' $$ CREATE FUNCTION 'ox_date'() RETURNS CHAR (50) CHARSET latin1 DECLARE ox VARCHAR (20) $$ IF @oxdate <1 THEN SET ox = CURDATE() $$ ELSE SET ox = @ oxdate $$ END IF $$ RETURN ox $$ DELIMITER; ............ (0 строк (ы) пострадавших) Время Исполнение: 00: 00: 00: 000 Время передачи: 00: 00: 00: 000 Общее время: 00: 00: 00: 000 (0 строк (ы) пострадавших, 1 предупреждение (s)) Время Исполнение: 00: 00: 00: 000 Время трансфера: 00: 00: 01: 061 Общее время: 00: 00: 01: 061 Код Ошибка: 106 Вы ошибка в синтаксисе SQL; проверить – bbutle01

ответ

0

Зачем вам нужно разбираться с разделителем? Для простой логики предпочтительнее использовать функцию IF для оператора IF.

CREATE FUNCTION `ox_date`() 
RETURNS CHAR(50) CHARSET latin1 
RETURN IF(@oxdate < 1 OR @oxdate IS NULL, CURDATE(),@oxdate) 

Else

DELIMITER $$ 

USE `cc`$$ 

DROP FUNCTION IF EXISTS `ox_date`$$ 

CREATE FUNCTION `ox_date`() 
RETURNS CHAR(50) CHARSET latin1 
RETURN IF(@oxdate < 1 OR @oxdate IS NULL, CURDATE(),@oxdate)$$ 

DELIMITER ; 
1

Я не эксперт, но вот несколько вещей, которые я вижу.

Во-первых, у вас есть

DELIMITER $$ 

, а затем использовать его в самой функции. Эта линия DELIMITER позволяет использовать точки с запятой в теле функции. В противном случае ';' преждевременно прекратит высказывание CREATE FUNCTION.

Кроме того, линия

DECLARE ox varchar(20) 

отсутствует точка с запятой в конце.

И тогда вы пропустили

END IF; 

после состояния другого.

Также как насчет BEGIN END $$, обернутого вокруг определения функции?

Я бы ожидать, хранимая функция обычно принимает форму:

DELIMITER $$ 
DROP FUNCTION IF EXISTS `testdb`.MyFunc$$ 
CREATE FUNCTION `testdb`.`MyFunc`() RETURNS INT 
BEGIN 
    DECLARE someVar varchar(20); 
    # some stuff 
    RETURN something; 
END $$ 

DELIMITER ; 

Изменение начинки функции в соответствии с вашими потребностями и устанавливая тип возвращаемого значения в зависимости от обстоятельств.

В любом случае, я не эксперт, но это то, что я вижу и надеюсь, что это поможет.