JyotiprakashSahoo Ответов: 3

Невозможно создать простую хранимую функцию в mysql


Привет,

Я пытаюсь создать простую функцию в MySql, которая может принимать два параметра и возвращать один параметр следующим образом:

DELIMITER $$
DROP FUNCTION IF EXISTS `itsnowdb`.`validateLogin`$$;
CREATE FUNCTION `itsnowdb`.`validateLogin(user_name varchar, pswd varchar)` RETURNS INT;
    BEGIN
    DECLARE result INT DEFAULT 0;
    DECLARE uname VARCHAR DEFAULT "";
	    SELECT userName INTO uname FROM user_master WHERE userName=user_name AND PASSWORD=pswd;
		IF (uname) THEN
			SET result=1;
		END IF;
    END $$
RETURN result;
DELIMITER;


Но я получаю ошибку, как показано ниже:

3 queries executed, 1 success, 2 errors, 1 warnings

Query: DROP FUNCTION IF EXISTS `itsnowdb`.`validateLogin`

0 row(s) affected, 1 warning(s)

Execution Time : 0 sec
Transfer Time  : 1.021 sec
Total Time     : 1.021 sec

Note Code : 1305
FUNCTION itsnowdb.validateLogin does not exist
--------------------------------------------------

Query: ; CREATE FUNCTION `itsnowdb`.`validateLogin( user_name varchar, pswd varchar)` RETURNS int; BEGIN DECLARE result int DEFAULT 0; ...

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ';
CREATE FUNCTION `itsnowdb`.`validateLogin( user_name varchar, pswd varchar)` R' at line 1

Execution Time : 0 sec
Transfer Time  : 0 sec
Total Time     : 0 sec
--------------------------------------------------
<pre>
Query: return result; DELIMITER;

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'return result;
DELIMITER' at line 1

Execution Time : 0 sec
Transfer Time  : 0 sec
Total Time     : 0 sec


Кто-нибудь, пожалуйста, дайте мне знать, где я ошибаюсь?

Что я уже пробовал:

Я пытался изменить код несколько раз.

3 Ответов

Рейтинг:
2

OriginalGriff

Посмотрите на сообщение об ошибке: оно говорит вам, в чем проблема:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ';'

Итак посмотрите на первую строку функции и убедитесь в этом:
CREATE FUNCTION `itsnowdb`.`validateLogin(user_name varchar, pswd varchar)` RETURNS INT;
Она заканчивается точкой с запятой.

Точка с запятой здесь не нужна; она не является частью синтаксиса: С mysql :: mysql с 8.0 справочник :: 13.1.17 процедура Create и Create функция [^]
Уберите точку с запятой, и ошибка исчезнет.


JyotiprakashSahoo

Привет Грифф,

Я ценю вашу помощь. после изменения кода,

DELIMITER $$
DROP FUNCTION IF EXISTS `itsnowdb`.`validateLogin`$$;
CREATE FUNCTION `itsnowdb`.`validateLogin`(user_name VARCHAR, pswd VARCHAR) RETURNS INT
    BEGIN
    DECLARE result INT DEFAULT 0;
    DECLARE uname VARCHAR DEFAULT "";
	    SELECT userName INTO uname FROM user_master WHERE userName=user_name AND PASSWORD=pswd;
		IF (uname!="") THEN
			result=1;
		ELSE
			result=0;
		END IF;
    END $$
RETURN result;
DELIMITER;

3 queries executed, 1 success, 2 errors, 1 warnings

Query: DROP FUNCTION IF EXISTS `itsnowdb`.`validateLogin`

0 row(s) affected, 1 warning(s)

Execution Time : 0 sec
Transfer Time  : 1.038 sec
Total Time     : 1.039 sec

Note Code : 1305
FUNCTION itsnowdb.validateLogin does not exist
--------------------------------------------------

Query: ; CREATE FUNCTION `itsnowdb`.`validateLogin`(user_name varchar, pswd varchar) RETURNS INT BEGIN DECLARE result INT DEFAULT 0; DE...

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ';
CREATE FUNCTION `itsnowdb`.`validateLogin`(user_name varchar, pswd varchar) RE' at line 1

Execution Time : 0 sec
Transfer Time  : 0 sec
Total Time     : 0 sec
--------------------------------------------------

Query: RETURN result; DELIMITER;

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'RETURN result;
DELIMITER' at line 1

Execution Time : 0 sec
Transfer Time  : 0 sec
Total Time     : 0 sec

Рейтинг:
18

JyotiprakashSahoo

DELIMITER $$

USE `itsnowdb`$$

DROP FUNCTION IF EXISTS `Check_Account`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `Check_Account`(i_id VARCHAR(50), ipass VARCHAR(20))  RETURNS VARCHAR(50)
BEGIN
    
    DECLARE uid VARCHAR(50) DEFAULT "PRASANTI COLONY";
    DECLARE o_Status INTEGER;
    SELECT u.loginID  FROM user_master u WHERE u.loginID=i_id AND u.pass=ipass INTO @uid ;
    /* SELECT u.loginID FROM USER_MASTER u WHERE u.loginID = i_id AND u.pass=ipass and u.status=1 into uid; */
    
    /*IF uid is null   THEN
        SET o_Status = 0; -- Invalid username
    ELSE
        SET o_Status = 1; -- Good
    END IF;*/
    RETURN uid;
END$$

DELIMITER ;

ПРИВЕДЕННЫЙ ВЫШЕ КОД РАБОТАЕТ ОТЛИЧНО, НО ОПЕРАТОР INTO, ПОХОЖЕ, НЕ СРАБОТАЛ. ВСЕГДА ВОЗВРАЩАЕТ ЗНАЧЕНИЕ NULL, ЛЮБОЕ ПРЕДПОЛОЖЕНИЕ ПЛЗ!!


Рейтинг:
11

JyotiprakashSahoo

DELIMITER $$

USE `itsnowdb`$$

DROP FUNCTION IF EXISTS `validate_login`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `validate_login`(`_id` VARCHAR(12) , `_pass` VARCHAR(64)) RETURNS VARCHAR(20) CHARSET latin1
    DETERMINISTIC
BEGIN
    DECLARE validate_login VARCHAR(20);
    DECLARE U_NAME VARCHAR(20);
    DECLARE PASSWORD VARCHAR(64);
SELECT userName,pass INTO U_NAME , PASSWORD FROM user_master WHERE loginID =_id;
    IF _pass=NULL THEN
		SET validate_login = 'invalid';
    ELSEIF (_pass = PASSWORD ) THEN
        SET validate_login = 'valid';
    ELSEIF _pass != PASSWORD THEN
        SET validate_login = 'invalid';
    END IF;
	RETURN (validate_login);
END$$

DELIMITER ;