Каков правильный синтаксис предложения if для хранимой функции MySQL? - PullRequest
3 голосов
/ 04 июня 2019

Я новичок в MySQL, поэтому прошу прощения, если что-то из этого является относительно элементарным.

Я пытаюсь написать хранимую функцию для округления цифры до определенного числа значащих цифр. У меня есть функция, которая, по идее, должна работать - я обратился к другому полезному StackOverflow, чтобы закрепить логику ( округление до n значащих цифр в SQL ). Тем не менее, числа от 1 до -1 (исключая 0, потому что я бросил в улове с краевым регистром) не могут округляться соответствующим образом; например, вызов sfround(.00123456789, 5), который должен дать 0,0012345, вместо этого дает 0,0012345999712124467.

В попытке исправить это, я надеялся усечь цифры от 1 до -1 (исключая 0) до числа тривиальных нулей ПЛЮС до количества необходимых сигн фиг. В приведенном ниже коде предложение IF предназначено для выполнения этого усечения. Однако я обнаружил, что всякий раз, когда я включаю это предложение IF, это приводит к ошибке:

'Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'DECLARE numDigits INT; SET numDigits = FLOOR (LOG10 (ABS (число))); #total d 'в строке 5).

Даже когда я экспериментировал с очень простым оператором IF, таким как

IF (5 = 5) THEN DECLARE dummyvar INT; END IF;

Я все еще получаю ту же ошибку в этой строке, что заставляет меня думать, что я упускаю что-то простое в моем синтаксисе MySQL для предложения IF.

DELIMITER $$

USE `vg_summary1`$$

DROP FUNCTION IF EXISTS `sfround`$$

CREATE FUNCTION 'sfround`(number FLOAT, sf INT) RETURNS FLOAT
DETERMINISTIC
BEGIN
     IF ((ABS(number) < 1) AND (ABS(number) > 0)) THEN            
        DECLARE numDigits INT;
        SET numDigits = FLOOR(LOG10(ABS(number)));     
        DECLARE trivialDigits INT;
        SET trivialDigits = 0;                         
                DECLARE placeholder FLOAT;
        SET placeholder = ABS(number);               

        WHILE placeholder < 1
        BEGIN
           placeholder = placeholder * 10;
           IF (placeholder < 1) THEN trivialDigits = trivialDigits + 1;    
           END IF;
        END;

        DECLARE keptDigits = trivialDigits + sf;

        DECLARE special_answer FLOAT;
        SET special_answer = ROUND(number, keptDigits-1-FLOOR(LOG10(ABS(number))));
        RETURN special_answer;

     END IF;

     DECLARE r FLOAT;

     SET r = CASE WHEN number = 0 THEN 0 ELSE ROUND(number, sf-1-FLOOR(LOG10(ABS(number)))) END;
     RETURN r;

   END$$

 DELIMITER ;

Если у кого-либо есть какие-либо предложения в отношении синтаксических ошибок или более логичных способов исправить исходную ошибку, я был бы очень признателен, чтобы их услышать! Большое вам спасибо!

1 Ответ

1 голос
/ 04 июня 2019

См. https://dev.mysql.com/doc/refman/8.0/en/declare.html

DECLARE разрешено только внутри составного оператора BEGIN ... END и должно быть в его начале перед любыми другими операторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...