Ошибка при создании процедуры с некоторыми параметрами ввода и последующей вставке в БД после проверки в MYSQL

0

Моя проблема в том, что я пытаюсь создать процедуру, которая получает входные параметры и проверяет, существуют ли данные или нет, чтобы иметь возможность вставлять их в одну таблицу. Я пробовал по-разному, и я не могу найти ошибку, которая появляется в синтаксисе объявления.

Пожалуйста, мне нужна помощь.

Огромное спасибо.

/* Далее я покажу код процедуры */

DELIMITER //

CREATE PROCEDURE InsertMensaje(IN pNOMBRE varchar(50), IN pTLFN varchar(9), IN pEMAIL varchar(50), IN pASN varchar(15), IN pMSG varchar(500))

BEGIN

    /*declare valiable*/
    DECLARE vIDCLI int;

/*THESE OPTIONS I HAVE ALSO TESTED*/
/*SET vIDCLI = (select id_cliente from tb_cliente where email = pEMAIL);*/
/*select id_cliente into vIDCLI from tb_cliente where email = pEMAIL;*/

/* DECLARE vAUX varchar(50)*/ 
/* SET vAUX = (select email from tb_cliente where email = pEMAIL);*/
/* select email into vAUX from tb_cliente where email = pEMAIL; */

/* IF (vAUX <=> NULL) THEN  */

    /*check if the pEMAIL parameter exists*/
    IF EXISTS (select id_cliente from tb_cliente where email = pEMAIL) THEN

    /*retrieve the ID and assign it to the variable*/
    select id_cliente into vIDCLI from tb_cliente where email = pEMAIL;

        /*insert in BD menssage table*/
        INSERT INTO 'tb_msg'('asn', 'msg', 'id_cli') VALUES ('pASN','pMSG','vIDCLI');

    ELSE
        /*insert new cliente*/
        INSERT INTO 'tb_cliente'('nombre', 'tlfn', 'email') 
                        VALUES ('pNOMBRE','pTLFN','pEMAIL');

        /*recovernew IdCli*/
        SET vIDCLI = (select id_cliente from tb_cliente where email = pEMAIL);

        /*insert in message table*/
        INSERT INTO 'tb_msg'('asn', 'msg', 'id_cli') VALUES ('pASN','pMSG',vIDCLI);
    END IF;
END; //

DELIMITER //

MySQL сказал:

1064 - Что-то не так в синтаксисе рядом с IF EXISTS (выберите id_cliente из tb_cliente, где email = pEMAIL) THEN 'on line 25

  • 1
    Пожалуйста, обновите название на английском языке, пожалуйста
  • 0
    Ок, готово, извините
Показать ещё 1 комментарий
Теги:
stored-procedures

2 ответа

0
  • Вы не можете использовать IF EXISTS внутри хранимой процедуры, поскольку вы пытались это сделать.
  • Во время объявления переменной vIDCLI вы можете установить значение по умолчанию null
  • Теперь, получить результаты Select Into переменной.
  • И затем проверьте, не является ли переменная vIDCLI IS NOT NULL (внутри условия if).

Попробуйте следующее:

/*declare variable - default it to null*/
DECLARE vIDCLI int(11) DEFAULT NULL;

select id_cliente into vIDCLI 
from tb_cliente 
where email = pEMAIL;

/*check if the pEMAIL parameter exists*/
IF vIDCLI IS NOT NULL THEN

У вас также есть другие ошибки в хранимой процедуре. После их исправления это выглядит так:

DELIMITER //

CREATE PROCEDURE InsertMensaje(IN pNOMBRE varchar(50), IN pTLFN varchar(9), IN pEMAIL varchar(50), IN pASN varchar(15), IN pMSG varchar(500))

BEGIN

    /*declare variable - default it to null*/
    DECLARE vIDCLI int(11) DEFAULT NULL;

   select id_cliente into vIDCLI 
   from tb_cliente where email = pEMAIL;

/* DECLARE vAUX varchar(50)*/ 
/* SET vAUX = (select email from tb_cliente where email = pEMAIL);*/
/* select email into vAUX from tb_cliente where email = pEMAIL; */

/* IF (vAUX <=> NULL) THEN  */

    /*check if the pEMAIL parameter exists*/
    IF vIDCLI IS NOT NULL THEN

        /*insert in BD menssage table*/
        INSERT INTO 'tb_msg'('asn', 'msg', 'id_cli') VALUES ('pASN','pMSG','vIDCLI');

    ELSE
        /*insert new cliente*/
        INSERT INTO 'tb_cliente'('nombre', 'tlfn', 'email') 
                        VALUES ('pNOMBRE','pTLFN','pEMAIL');

        /*recovernew IdCli*/
        select id_cliente into vIDCLI 
        from tb_cliente where email = pEMAIL;

        /*insert in message table*/
        INSERT INTO 'tb_msg'('asn', 'msg', 'id_cli') VALUES ('pASN','pMSG',vIDCLI);
    END IF;
END//

DELIMITER ;
  • 0
    Огромное спасибо. Но все равно выдает ошибку в переменной, которая собирает из выбора
  • 0
    @ Мигель, что за сообщение об ошибке. Пожалуйста, дайте детали здесь.
Показать ещё 3 комментария
0

Хотя я не разработчик БД, вы, вероятно, могли бы сделать это (это просто идея, точный синтаксис может отличаться!):

select count(id_cliente) into cnt_clients from tb_cliente where email = pEMAIL;
IF cnt_clients > 0 /* EXISTS case */
...
ELSE /* NOT EXISTS case */

Ещё вопросы

Сообщество Overcoder
Наверх
Меню