Я не эксперт, но вот несколько вещей, которые я вижу.
Во-первых, у вас есть
DELIMITER $$
, а затем используйте его в самой функции. Эта строка DELIMITER позволяет вам использовать точки с запятой в теле функции. В противном случае ';' завершит оператор CREATE FUNCTION преждевременно.
Также линия
DECLARE ox varchar(20)
в конце отсутствует точка с запятой.
И тогда вам не хватает
END IF;
после условия else.
А как насчет 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 ;
Изменение функций кишечника в соответствии с вашими потребностями и установка типа возврата соответствующим образом.
В любом случае, я не эксперт, но это то, что я вижу, и надеюсь, что это поможет.