SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 24.03.2009 19:28:27

susumi
Участник
Зарегистрирован: 23.03.2009
Сообщений: 4

помогите найти ошибку в процедуре

я совсем начинающий пользователь mysql. Никак не могу понять, что ему не нравится... ошибка синтаксеса

CREATE PROCEDURE INS_VED ( out sname char(50), out scategory char(50), out scafe char(50), out smark char(50)) begin
DECLARE  ID_st int;
DECLARE  ID_sb INT;
DECLARE  ID_mr INT;
IF (NOT EXISTS (SELECT * FROM food WHERE name = sname  AND category = scategory))
THEN
INSERT INTO food(name, category) VALUES (sname, scategory);
SELECT ID_food FROM food WHERE name=:sname and category=scategory INTO id_st;
IF (NOT EXISTS (SELECT * FROM cafe WHERE name = scafe))
THEN
INSERT INTO cafe(name) VALUES (scafe);
SELECT ID_cafe FROM cafe WHERE name=:scafe INTO id_sb;
IF (NOT EXISTS (SELECT * FROM marks WHERE name = smark))
THEN
INSERT INTO marks (name) VALUES (:smark);
SELECT ID_marks FROM marks WHERE name=smark INTO id_mr;
IF (NOT EXISTS (SELECT * FROM Wher WHERE ID_Food = id_st AND ID_cafe = id_sb AND ID_marks = id_mr))
THEN
INSERT INTO Wher (ID_food, ID_cafe, ID_marks) VALUES (id_st, id_sb, id_mr);
END;

Неактивен

 

#2 24.03.2009 21:29:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: помогите найти ошибку в процедуре

Есть жесткое ощущение, что Вы копируете код, предназначенный для MSSQL smile

1. В MySQL параметры не передаются с двоеточием в начале.
2. Если запускаете этот код в клиенте MySQL, то нужно выставлять правильный разделитель
(delimiter ;wink и завершать команду этим разделителем.

Неактивен

 

#3 24.03.2009 22:07:55

susumi
Участник
Зарегистрирован: 23.03.2009
Сообщений: 4

Re: помогите найти ошибку в процедуре

так и есть я более менее знаю mssql, и вот пытаюсь разобраться с Mysql
delimiter //
CREATE PROCEDURE INS_VED ( in sname char(20), in scategory char(20), in scafe char(20), in smark char(20))
begin
DECLARE  ID_st int;
DECLARE  ID_sb INT;
DECLARE  ID_mr INT;
IF (NOT EXISTS (SELECT * FROM food WHERE name = sname  AND category = scategory))
THEN
INSERT INTO food(name, category) VALUES (sname, scategory);
SELECT ID_food FROM food WHERE name=sname and category=scategory INTO id_st;
IF (NOT EXISTS (SELECT * FROM cafe WHERE name = scafe))
THEN
INSERT INTO cafe(name) VALUES (scafe);
SELECT ID_cafe FROM cafe WHERE name=scafe INTO id_sb;
IF (NOT EXISTS (SELECT * FROM marks WHERE name = smark))
THEN
INSERT INTO marks (name) VALUES (smark);
SELECT ID_marks FROM marks WHERE name=smark INTO id_mr;
IF (NOT EXISTS (SELECT * FROM Wher WHERE ID_Food = id_st AND ID_cafe = id_sb AND ID_marks = id_mr))
THEN
INSERT INTO Wher (ID_food, ID_cafe, ID_marks) VALUES (id_st, id_sb, id_mr);
END; //

так же ошибка синтаксиса... Ругается на delimiter //

Отредактированно susumi (24.03.2009 22:32:11)

Неактивен

 

#4 24.03.2009 22:59:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: помогите найти ошибку в процедуре

Уже лучше. Какой клиент? delimiter — команда стандартного консольного клиента.

Синтаксис IF у Вас не правильный — в MySQL они требуют явного закрывания (END IF):
http://dev.mysql.com/doc/refman/5.1/en/ … ement.html

В остальном, вроде, визуально правильно, должно работать.

Неактивен

 

#5 25.03.2009 07:01:35

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: помогите найти ошибку в процедуре

Каждую условную конструкцию нужно завершать оператором END IF;

IF NOT EXISTS (SELECT * FROM food WHERE name = sname  AND category = scategory) THEN
    INSERT INTO food(name, category) VALUES (sname, scategory);
    SELECT ID_food FROM food WHERE name=sname and category=scategory INTO id_st;
END IF;

IF NOT EXISTS (SELECT * FROM cafe WHERE name = scafe) THEN
    INSERT INTO cafe(name) VALUES (scafe);
    SELECT ID_cafe FROM cafe WHERE name=scafe INTO id_sb;
END IF;
...

Неактивен

 

Board footer

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