1

Тема: Хранимые процедуры

Подскажите plz что я неправильно делаю:

DROP PROCEDURE IF EXISTS addnews;
CREATE PROCEDURE addnews (id_user_in INT, title_in varbinary(128), data_in blob)
BEGIN
INSERT INTO `news` SET `time_in`=NOW(), `id_user`=id_user_in, `title`=title_in, `data`=data_in;
END;

При этом есть таблица `news`:

CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `time_in` datetime NOT NULL,
  `id_user` int(11) NOT NULL,
  `title` varchar(128) NOT NULL,
  `data` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `time_in` (`time_in`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

Возвращает следующее:

#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 'INSERT INTO `news` SET `time_in`=NOW(), `id_user`=id_user_in, `title`=title_in, ' at line 3

Заранее большое спасибо...

2

Re: Хранимые процедуры

Не забывайте писать версии используемых программ, в частности сервера MySQL и используемого скрипта phpMyAdmin.

Запрос выполняется через phpMyAdmin? Пробовали через командную строку?

Запрос без использования процедуры выполняется нормально?
INSERT INTO `news` SET `time_in`=NOW(), `id_user`=id_user_in, `title`=title_in, `data`=data_in;

Вообще-то тонкостей использования процедур и функций очень много, я все равно не смогу перекопировать сюда весь справочный материал из руководства MySQL. Например, если не указывать БД для которой сохраняется процедура, то она будет сохраняться для изначальной (default) БД.

3

Re: Хранимые процедуры

Да, через командную строку работает. И создаётся в базе "mysql", как сделать так, чтоб оно в моей базе сохранялась?
Проблема в том, что phpmyamdin не понимает команды "delimiter" вот и всё...

4

Re: Хранимые процедуры

anlide
Версия phpMyAdmin какая установлена?

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

5

Re: Хранимые процедуры

Lokki сказал:

anlide
Версия phpMyAdmin какая установлена?

phpMyAdmin - 2.9.0.3

6

Re: Хранимые процедуры

anlide
Попробуй 2.9.2 - Это последняя стабильная версия, в ней как раз улучшена работа с хранимыми процедурами и др. "вкусностями" MySQL 5
Аннотация phpMyAdmin 2.9.2
Скачать phpMyAdmin 2.9.2

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

7

Re: Хранимые процедуры

anlide
Да дело то не только в том, где хранить процедуры, но и в том как их вызывать.
db_name.sp_name

Надо также понимать, что некоторые процедуры может выполнять только root или пользователь наделенный grant привилегиями, так как иногда требуется доступ к БД mysql.

Как это - "phpMyAdmin не понимает delimiter" - а на кой лях поле delimiter во вкладке SQL?

8

Re: Хранимые процедуры

Вот код, который работает через консольку mysql.

DROP PROCEDURE IF EXISTS addnews;
DELIMITER ;; ;
CREATE PROCEDURE addnews (id_user_in INT, title_in varbinary(128), data_in blob)
BEGIN
INSERT INTO `news` SET `time_in`=NOW(), `id_user`=id_user_in, `title`=title_in, `data`=data_in;
END;;
DELIMITER ; ;;

Если где угодно вызвать "CALL addnews (1,'test','test body');" - то соответственно процедура будет выполнена. Дело в том, что внутри операторных скобок "begin...end" должны стоять команды отделённые ";". НО!!! mysql распознаёт эту ";" как конец ПРОЦЕДУРЫ. Соответственно вылетает с синтаксической ошибкой. В инете я насмотрел многие сталкиваются с этой проблемой - решение использование DELIMITER. Который заменяет ключевой символ конца команды на любой другой. Символ ";" теперь свободен и может быть использован по назначению внутри процедуры.

Далее - phpmyadmin непонимает команду DELIMITER. Со страшнючими матами вылетает с ошибкой. Выполнение всего запроса соответственно невозможно.

С правами доступа я буду разбиратся позже... ща главное чтоб хоть как-то работало...

Спасибо, попробую новый phpmyadmin...

9

Re: Хранимые процедуры

anlide

DROP PROCEDURE IF EXISTS db_name.addnews;
DELIMITER //
CREATE PROCEDURE db_name.addnews (id_user_in INT, title_in varbinary(128), data_in blob)
BEGIN
INSERT INTO `news` SET `time_in`=NOW(), `id_user`=id_user_in, `title`=title_in, `data`=data_in;
END;//
DELIMITER ;

Этот вариант ближе к тому, что предлагает документация MySQL, которую вам стоило почитать, плюс определяет БД хранимой процедуры, если она отличается от изначальной (default). db_name - имя БД для хранения и вызова процедуры. Обратите внимание на существенные различия:
1) delimiter определяется подстановкой символов, то есть у вас delimiter получается не ";;", а ";; ;".
2) Конец запроса, тоже не корректен "END;;", здесь должно быть "END;".
3) Возврат символа разделителя ";" должен выглядеть так "DELIMITER ;".

Теперь по поводу phpMyAdmin. Во вкладке SQL, как я уже говорил, есть поле delimiter, в которое надо вставить символ разделитель, в предлагаемом мной примере это "//", естественно из запросв строку определяющую разделитель надо убрать и оставить только сам запрос

DROP PROCEDURE IF EXISTS db_name.addnews//
CREATE PROCEDURE db_name.addnews (id_user_in INT, title_in varbinary(128), data_in blob)
BEGIN
INSERT INTO `news` SET `time_in`=NOW(), `id_user`=id_user_in, `title`=title_in, `data`=data_in;
END;//

Обратите внимание, что оба запроса должны быть отделены установленым разделителем в виде "//".

10

Re: Хранимые процедуры

Спасибо большое, вы ответили на мои вопросы smile .

Хочу также заметить, что хранимая процедура создаётся в текущей выбранной БД. То есть если была команда "use myDB" то после этого можно не указывать (default).
На тему delimiter в mysql - вы всё правильно описали. Но тем-не-менее из php скрипта новость добавляется посредством команды CALL. Даже несмотря, что у меня были грубые нарушения в синтаксисе... видимо на самом деле mysql смотрит комбинацию символов после слова delimiter до ближайшего пробела или конца строки.
В phpmyadmin теперь тоже скрипт запускается smile большое вам спасибо smile

Ещё стоит упамянуть о такой детальке. У меня в скрипте не хотела выполнятся эта процедура. Проблема была в том, что в phpmyadmin пользователь имеет полные права. А в скрипте очень ограниченные (я специально обрезал доступ). В результате выяснилось, что надо было поставить право на команду EXECUTE...

11

Re: Хранимые процедуры

anlide
Пожалуйста, рад был помочь.
В свою очередь благодарю вас за ценные дополнения.