SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 09.11.2007 18:15:37

Lem0nti
Гуру
Откуда: Северная Пальмира
Зарегистрирован: 08.11.2007
Сообщений: 98

Проблема с процедурой

Такие дела, не могу понять где я не прав. Есть процедура, её код отрабатывает. Код примерно такой:

Код:

CREATE DEFINER = 'root'@'localhost' PROCEDURE `StartContext`(IN ADT DATETIME, IN ANum vaRCHAR(10), IN AKodPers vARCHAR(20), IN ANamePers vARCHAR(40), IN AID_Obj INTEGER(11), OUT AID_CONTEXT INTEGER(11))
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  BEGIN
       insert into Personal (KOD, NAME) values (AKodPers, ANamePers);
       insert into Context(ID_Obj, KODPERS, STARTDT, NUM)
                   values(AID_Obj, AKodPers, ADT, ANum);
  END;
  
  insert into Context(ID_Obj, KODPERS, STARTDT, NUM)
               values(AID_Obj, AKodPers, ADT, ANum);

  SET AID_CONTEXT=last_insert_id();
END;

Строки вставляются, всё прелестно. Но тут возникает проблема с тем, как добыть значение out параметра. Компонент, который я использую генерит примерно такой код:

Код:

CALL StartContext(NOW(),0,'0001                ','Иванов                        ',2,@AID_CONTEXT);

SELECT CAST(@AID_CONTEXT AS SIGNED) AS '@AID_CONTEXT';

При исполнении - ошибка:

Код:

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 ';

SELECT CAST(@AID_CONTEXT AS SIGNED) AS '@AID_CONTEXT'' at line 1

Пробовал играться кастом или убирать его совсем - не помогает. Похоже не нравится вызов процедуры рядом ещё с чем-то. Подскажите, пожалуйста вариант как бы мне добыть вообще значение out параметра, пусть даже и не таким кодом.

Неактивен

 

#2 09.11.2007 18:44:34

Lem0nti
Гуру
Откуда: Северная Пальмира
Зарегистрирован: 08.11.2007
Сообщений: 98

Re: Проблема с процедурой

В общем, переделал на функцию. Но вопрос остаётся открытым - подскажите как добывать значения out параметров?

Неактивен

 

#3 09.11.2007 20:05:30

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

Re: Проблема с процедурой

Возможно, при написании кода процедуры Вы использовали DELIMITER, отличный от точки с запятой.
Не забыли ли Вы его поменять обратно на точку с запятой?

Неактивен

 

#4 11.11.2007 12:50:43

Lem0nti
Гуру
Откуда: Северная Пальмира
Зарегистрирован: 08.11.2007
Сообщений: 98

Re: Проблема с процедурой

Я не менял. Подскажите, если он изменён каким-либо образом автоматически, ну может быть SQL Manager там как-то переключает, как мне узнать его?

Неактивен

 

#5 11.11.2007 13:24:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с процедурой

Попробуйте SELECT 1; SELECT 2; Если ошибка, значит он изменен. Изменить на точку с запятой можно командой DELIMITER ;

Неактивен

 

#6 12.11.2007 11:13:26

Lem0nti
Гуру
Откуда: Северная Пальмира
Зарегистрирован: 08.11.2007
Сообщений: 98

Re: Проблема с процедурой

Чего то у меня голова кругом уже идёт ... SELECT 1; SELECT 2; - не работает, тут вы правы. Но!!! - и DELIMITER ; не работает тоже:

Код:

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' at line 1

Неактивен

 

#7 12.11.2007 15:47:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с процедурой

Значит процедура у Вас не создалась. Вы ее заканчиваете точкой с запятой, но точка с запятой используется внутри процедуры. соответственно закончить определение процедуры надо символом, который указан в DELIMITER;
например
DELIMITER //
CREATE DEFINER = 'root'@'localhost' PROCEDURE `StartContext`(IN ADT DATETIME, IN ANum vaRCHAR(10), IN AKodPers vARCHAR(20), IN ANamePers vARCHAR(40), IN AID_Obj INTEGER(11), OUT AID_CONTEXT INTEGER(11))
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  BEGIN
       insert into Personal (KOD, NAME) values (AKodPers, ANamePers);
       insert into Context(ID_Obj, KODPERS, STARTDT, NUM)
                   values(AID_Obj, AKodPers, ADT, ANum);
  END;
 
  insert into Context(ID_Obj, KODPERS, STARTDT, NUM)
               values(AID_Obj, AKodPers, ADT, ANum);

  SET AID_CONTEXT=last_insert_id();
END//
SELECT 1 //
SELECT 2 //

Неактивен

 

#8 12.11.2007 16:07:27

Lem0nti
Гуру
Откуда: Северная Пальмира
Зарегистрирован: 08.11.2007
Сообщений: 98

Re: Проблема с процедурой

Тут похоже среда (SQL Manager for MySQL) сама берёт на себя переключение делимитеров, потому что выдаваемый DDL не содержит их. Но процедура создана, это факт, потому что при использовании другой среды, например от самих AB, я её вижу.
После перезагрузки машины, ругаться на делимитер перестал.
Итого, если я правильно понимаю оставленные здесь сообщения, то этот код должен отработать:?

Код:

CALL StartContext(NOW(),0,'0001                ','Иванов                        ',2,@AID_CONTEXT);

SELECT CAST(@AID_CONTEXT AS SIGNED) AS '@AID_CONTEXT';

Неактивен

 

#9 12.11.2007 19:13:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с процедурой

У меня работает, но ругается, что нет таблицы, что закономерно

Неактивен

 

Board footer

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