SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 07.02.2009 12:30:17

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Помогите, пожалуйста. Хранимая процедура не пашет.

Народ плз. Подскажите, что не так уже совсем умаялся, а она всё непашет

Выдаёт ошибку: Explicit or implicit commit is not allowed in stored function or trigger.:



CREATE FUNCTION `CREATE_ARTICLE_USERS_GRANT`(table_prefix TINYTEXT, table_name TINYTEXT, idnr_field_name TINYTEXT, user_login_field_name TINYTEXT, root_user TINYTEXT)
RETURNS INT
LANGUAGE SQL
 BEGIN
  DECLARE root_user_id INT;
  DECLARE selected_id INT DEFAULT 0;
  DECLARE new_table_name TINYTEXT;
  DECLARE counter INT;
  DECLARE i INT DEFAULT 0;

  SET root_user_id = (SELECT idnr_field FROM table_name WHERE user_login_field_name = root_user LIMIT 1);
  SET new_table_name = CONCAT(table_prefix, "_article_users_grant");
  SET counter = (SELECT count(idnr_field_name) FROM table_name WHERE idnr_field_name <> root_user_id LIMIT 1);

  CREATE TABLE new_table_name (
                               `user_id` MEDIUMINT UNSIGNED NOT NULL,
                               `article_grants_id` TINYINT( 1 ) UNSIGNED NOT NULL ,
                                PRIMARY KEY ( `user_id` ) ,INDEX ( `article_grants_id` )
                              );

  INSERT INTO new_table_name ( `user_id` , `article_grants_id` )
         VALUES (root_user_id, "1");
   WHILE i < counter DO
    SET i = i +1;
    SET selected_id = (SELECT idnr_field FROM table_name WHERE idnr_field_name > selected_id AND  idnr_field_name <> root_user_id ORDER BY idnr_field_name ASC LIMIT 1);
    INSERT INTO new_table_name ( `user_id` , `article_grants_id` )
         VALUES (selected_id, "5");
   END WHILE;
   RETURN selected_id;
 END;

 


Заранее благодарю.

Отредактированно alexeews (07.02.2009 12:31:24)

Неактивен

 

#2 07.02.2009 13:09:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите, пожалуйста. Хранимая процедура не пашет.

http://dev.mysql.com/doc/refman/5.1/en/ … table.html
CREATE TABLE does not automatically commit the current active transaction if you use the TEMPORARY keyword.


Кроме того у вас будет создана таблица с именем "new_table-name", а не с тем значением, которое принимает эта переменная. Для преодоления этой трудности нужно использовать подготовленные выражения, см тему http://sqlinfo.ru/forum/viewtopic.php?id=363
Однако, подготовленные выражения можно использовать в хранимых процедурах, но не функциях.

Неактивен

 

#3 07.02.2009 13:15:17

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Помогите, пожалуйста. Хранимая процедура не пашет.

c CREATE TABLE, разобрался спс. Но назрел ещё один вопрос в запросах вместо переданных параметоров (таких как table_name и т.д.) используются не значения, а именно строки т.е.  table_name так и подставляется как table_name, а не как переменная, то возможно исправить в функцииях?

Неактивен

 

#4 07.02.2009 13:50:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите, пожалуйста. Хранимая процедура не пашет.

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

Неактивен

 

#5 07.02.2009 14:10:09

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Помогите, пожалуйста. Хранимая процедура не пашет.

Спасибо, за ответ, решил задачу в лоб, просто переложил формирование кода MySQL функций на пых. Жаль, что красиво сделать не получилось.

Неактивен

 

Board footer

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