SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.06.2018 21:12:20

nixon232
Участник
Зарегистрирован: 24.06.2018
Сообщений: 5

Вопрос о хранимых процедурах/ф-ях

Проблема 1:
Пытаюсь создать простенькую тестовую ф-ю и упорно не компилирует

Код:

DELIMITER //

CREATE FUNCTION IsUser (IN UserName VARCHAR (50)) RETURNS INTEGER
BEGIN
 DECLARE RetVal INTEGER;
SELECT id INTO RetVal FROM table WHERE user=UserName;
 RETURN IFNULL(RetVal, 0);
END //

   DELIMITER ;

и проблема в том, что я не понимаю на что имено Он ругается. Якобы на строку 1, но там делимитер переназначается же

;
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN UserName VARCHAR (50)) RETURNS INTEGER
BEGIN
DECLARE RetVal INTEGER;
SELE' at line 1 */

Менял даже INTEGER на INT

Проблема 2:

Код:

 DROP procedure IF EXISTS UserExist //

CREATE procedure UserExist (IN UserName VARCHAR(50), out RetMsg int)

  BEGIN

    SELECT id INTO RetMsg FROM Tab WHERE user = UserName;

  END;
//
DELIMITER ;

DELIMITER //
DROP procedure IF EXISTS SomeAuth //
CREATE PROCEDURE SomeAuth (UserName VarCHAR(50))
  BEGIN
    DECLARE pid int DEFAULT 0;
    DECLARE pMSG int DEFAULT 0;
    DECLARE pFile Mediumblob;
    DECLARE IsUser VARCHAR(20);
    set IsUser ='DefVal';
    call UserExist(UserName, @pMSG);

    if pMSG = 0 then
      set pid = 0;
        else
      set pid = 1;
    end iF;
  select @pid, @pMSG ;
  END //

DELIMITER ;
call SomeAuth('eefe490baa7c36fe1d073cc43fdcabf8');

Результат

@pid   @pMSG
  <null>   20

и сразу куча вопросов
Почему Pid null, если Default 0?
Почему не сработал If? С примерами из инета я отличий не вижу

Код:

mysql> DELIMITER // ;
mysql> CREATE PROCEDURE coursedetails_IFELSE(IN S_Subject Varchar(20), OUT S_Course varchar(50))
   -> BEGIN
   -> DECLARE Sub Varchar(20);
   -> SELECT Subject INTO SUB
   -> FROM Student_info WHERE S_Subject = Subject;
   -> IF Sub = 'Computers' THEN
   -> SET S_Course = 'B.Tech(CSE)';
   -> ELSE
   -> SET S_Course = 'Subject Not in the table ';
   -> END IF;
   -> END //
Query OK, 0 rows affected (0.00 sec

Отредактированно nixon232 (24.06.2018 21:14:01)

Неактивен

 

#2 24.06.2018 21:36:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Вопрос о хранимых процедурах/ф-ях

IN, OUT и INOUT могут быть только у процедур

Неактивен

 

#3 24.06.2018 21:43:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Вопрос о хранимых процедурах/ф-ях

pid и @pid разные переменные (см https://sqlinfo.ru/forum/viewtopic.php?id=363), вторую вы нигде не определяете, поэтому она null

Неактивен

 

#4 24.06.2018 23:22:42

nixon232
Участник
Зарегистрирован: 24.06.2018
Сообщений: 5

Re: Вопрос о хранимых процедурах/ф-ях

Спасибо, как и предпологал, вопросы оказались плевые. Но если второй еще кое-как мог решить сам (хотя сама проблема произошла из-за чтетия сразу нескольких источников. Одни писали через собаку, другие нет. Я и решил, что через собаку пишется есои используется указатель на переменную), то ответ на первый бы не нашел бы.
Ну и спасибо за статью.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson