Задавайте вопросы, мы ответим
Вы не зашли.
Такие дела, не могу понять где я не прав. Есть процедура, её код отрабатывает. Код примерно такой:
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 параметра, пусть даже и не таким кодом.
Неактивен
В общем, переделал на функцию. Но вопрос остаётся открытым - подскажите как добывать значения out параметров?
Неактивен
Возможно, при написании кода процедуры Вы использовали DELIMITER, отличный от точки с запятой.
Не забыли ли Вы его поменять обратно на точку с запятой?
Неактивен
Я не менял. Подскажите, если он изменён каким-либо образом автоматически, ну может быть SQL Manager там как-то переключает, как мне узнать его?
Неактивен
Попробуйте SELECT 1; SELECT 2; Если ошибка, значит он изменен. Изменить на точку с запятой можно командой DELIMITER ;
Неактивен
Чего то у меня голова кругом уже идёт ... 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
Неактивен
Значит процедура у Вас не создалась. Вы ее заканчиваете точкой с запятой, но точка с запятой используется внутри процедуры. соответственно закончить определение процедуры надо символом, который указан в 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 //
Неактивен
Тут похоже среда (SQL Manager for MySQL) сама берёт на себя переключение делимитеров, потому что выдаваемый DDL не содержит их. Но процедура создана, это факт, потому что при использовании другой среды, например от самих AB, я её вижу.
После перезагрузки машины, ругаться на делимитер перестал.
Итого, если я правильно понимаю оставленные здесь сообщения, то этот код должен отработать:?
CALL StartContext(NOW(),0,'0001 ','Иванов ',2,@AID_CONTEXT); SELECT CAST(@AID_CONTEXT AS SIGNED) AS '@AID_CONTEXT';
Неактивен
У меня работает, но ругается, что нет таблицы, что закономерно
Неактивен