KhanTengri
@KhanTengri

Как правильно писать хранимые процедуры в MySQL с блоком IF/THEN/ELSE внутри? (юзерам IntelliJ IDEA тоже сюда)?

Полностью вопрос звучит так: Как правильно написать хранимую процедуру в MySQL, внутри которой есть блок IF THEN ELSE, что бы этот скрипт затем можно было выполнять из разных сред без синтаксических ошибок?


Я поясню…

SQL-скрипт можно выполнить разными способами:
  1. из командной строки;
  2. из специальных GUI-тулз, вроде MySQL Administrator или MySQL Query Browser;
  3. из интегрированных сред, вроде IntelliJ IDEA...
  4. etc.



Пишешь обычную процедуру, и все прекрасно работает и выполняется. Особых проблем нет.

Но как только внутри процедуры объявляется блок IF THEN ELSE сразу начинаются проблемы…



Где-то приходится сперва задавать разделитель (DELIMITER $$) и только так этот скрипт будет принят и выпонен.


Кто-то, например MySQL Administator из MySQL GUI Tools, наоборот его не принимает.

Ему нужна только сама процедура…


А в IDE IntelliJ IDEA, например, при попытке запуска хранимой внутри которой есть IF THEN ELSE, что с DELIMITER $$, что без него… вообще никак не работает!


DROP PROCEDURE IF EXISTS p;

DELIMITER $$

CREATE PROCEDURE p(IN Number INT)
BEGIN
IF NUMBER = 1 THEN
SELECT * FROM tblProduct WHERE ProductID = Number;
ELSE
SELECT * FROM tblProduct WHERE ProductId = 2;
END IF;
END $$

DELIMITER ;


[42000][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 'DELIMITER $$

<...>



и


CREATE PROCEDURE p(IN Number INT)
BEGIN
IF NUMBER = 1 THEN
SELECT * FROM tblProduct WHERE ProductID = Number;
ELSE
SELECT * FROM tblProduct WHERE ProductId = 2;
END IF;
END;


[42000][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 '' at line 4

ELSE

<...>



Как, вообще, процедуры пишутся в MySQL?


ЗЫЖ Сорри, может сумбурно написал, но что-то вот не понятно мне, как такое может быть что бы синтаксис процедуры мог не выполняться в какой-либо среде. В голове каша.

UPD: Похоже, что я понял, в чем дело. JDBC не поддерживает DELIMITER
  • Вопрос задан
  • 16034 просмотра
Пригласить эксперта
Ответы на вопрос 2
Shedal
@Shedal
У меня с вот таким синтаксисом никогда не было проблем:

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_test`$$

CREATE DEFINER=`user`@`%` PROCEDURE `sp_test`(
	IN Number INT
	)
    READS SQL DATA
BEGIN
	-- 
	-- Код здесь
	-- 
END$$

DELIMITER ;


Поинтересуюсь: а зачем вам запускать хранимые процедуры из IDEA?
Ответ написан
stas_agarkov
@stas_agarkov
Я программист
Это говорит о том, что синтаксис SQL делали идиоты. Какой нахрен DELIMITER? В нормальных языках программирования нет такого (ключевого слова).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы