MySQL, запрос браузера, код ошибки -1 - PullRequest
2 голосов
/ 04 декабря 2009

У меня довольно странная проблема с MySQL. Попытка создать процедуру для обновления некоторых полей в базе данных (код приведен ниже).

Проблема в строке, которая в данный момент прокомментирована. Похоже, что если во время процедуры не выполняются операторы SELECT, браузер запросов MySQL вернет код ошибки «-1, ошибка при выполнении запроса SQL».

Я попробовал то же самое в HeidiSQL, и ошибка была "не могу вернуть набор результатов". Поэтому я полагаю, что вопрос в том, должен ли я всегда выбирать что-то в процедуре, или я пропустил что-то другое.

Запрос отлично работает при удалении комментария.

DELIMITER /
DROP PROCEDURE IF EXISTS updateFavourites /
CREATE PROCEDURE updateFavourites(quota INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE artist_id,releases INT;
DECLARE c_artist Cursor FOR
    SELECT Artist.id_number,COUNT(Artist.id_number) FROM Artist
    JOIN CD ON CD.is_fronted_by = Artist.id_number
GROUP BY Artist.id_number;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
    SET done=1;

IF quota > 0 THEN
    OPEN c_artist;
    REPEAT
    FETCH c_artist INTO artist_id,releases;
        IF NOT done THEN
        IF releases >= quota THEN
            UPDATE CD SET CD.rating='favourite' WHERE CD.is_fronted_by = artist_id;
        END IF;
    END IF;
UNTIL done END REPEAT;
CLOSE c_artist;
-- SELECT 'Great success';
ELSE
    SELECT CONCAT('\'quota\' must be greater than 0.',' Got (',quota,')'); 
END IF;

END /
DELIMITER ;

Вот sql для создания таблиц и некоторых данных:

DROP TABLE IF EXISTS CD;
DROP TABLE IF EXISTS Artist;

CREATE TABLE Artist (
id_number INT UNSIGNED AUTO_INCREMENT  PRIMARY KEY,
name VARCHAR(50),
);

CREATE TABLE CD (
catalog_no      INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
is_fronted_by       INT UNSIGNED,
rating          ENUM ('favourite','top draw','good','so-so','poor','rubbish'),
CONSTRAINT fk_CD_Artist  FOREIGN KEY (is_fronted_by) REFERENCES Artist(id_number) ON UPDATE     CASCADE
);

INSERT INTO Artist VALUES(11,'Artist 1');
INSERT INTO Artist VALUES(10,'Artist 2');
INSERT INTO CD VALUES (7,11, 'top draw');
INSERT INTO CD VALUES (650,11,'good');
INSERT INTO CD VALUES (651,11,'good');
INSERT INTO CD VALUES (11,10,'favourite');

Ответы [ 3 ]

2 голосов
/ 10 декабря 2009

Обозреватель запросов не для запуска скриптов, просто один запрос. Я попробовал ваш код, переместив курсор в каждый запрос (кроме DELIMITER) и нажав Ctrl + Enter. Он создал эту хранимую процедуру без проблем. (просто обновите схему слева).

Если вы хотите создать процедуру, используйте меню «Сценарий» -> «Создать хранимую процедуру / функцию».

Но лучше забыть о QueryBrowser, он вообще не поддерживается (и фактически не полезен). Если у вас достаточно оборудования и много ресурсов, попробуйте Workbench 5.2 , в противном случае используйте SQLyog

1 голос
/ 09 декабря 2009

Погуглив, есть несколько сообщений об одной и той же ошибке, но мало информации для решения проблемы. На mysql.com даже зарегистрирована ошибка ошибка , но, похоже, она была оставлена ​​без разрешения.

Есть еще один вопрос StackOverflow по той же ошибке, но он также не решен.

Все это означает, что в запросе нет набора результатов. Глядя на исходный код, кажется, что иногда устанавливается состояние ошибки MYX_SQL_ERROR, когда у запроса нет набора результатов. Возможно, это не подходящее следствие?

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


обновление: Я попытался восстановить отчет об ошибках MySQL и предоставить для них хороший контрольный пример. Они изменили ошибку с «нет обратной связи» на «подтверждено» - поэтому, по крайней мере, они признают, что это ошибка в браузере запросов:

[11 декабря 9:18] Света Смирнова

Bill

спасибо за отзыв. проверенный как описано.

Хотя, скорее всего, это будет только исправлено, когда MySQL Query Browser функциональность является частью MySQL верстак.

Я думаю, что обходной путь - игнорировать ошибку -1 или проверить свои хранимые процедуры в клиенте командной строки mysql, где ошибка не возникает.

Комментарий предполагает, что проблема исчезнет, ​​когда функциональность браузера запросов станет частью MySQL Workbench. Это должно произойти в MySQL Workbench 5.2 . Я скачаю эту бета-версию и попробую.

MySQL Workbench 5.2 находится в бета-версии, но я бы предположил, что MySQL не может предсказать, когда бета-версия станет GA. Подобные прогнозы достаточно сложны в стандартных условиях, но из-за неразрешенного приобретения Oracle много дополнительной неопределенности относительно судьбы MySQL.


обновление: Хорошо, я попробовал MySQL Workbench 5.2.10 beta. Я выполнил хранимую процедуру следующим образом:

CREATE PROCEDURE FooProc(doquery SMALLINT)
BEGIN
  IF doquery THEN
    SELECT * FROM Foo;
  END IF;
END

Когда я CALL FooProc(0), результат ответа не установлен, а статус просто «ОК».

При I CALL FooProc(1) ответом является результат SELECT * FROM Foo, как и ожидалось.

Однако есть еще одна ошибка, связанная с вызовом процедур. Процедуры могут иметь несколько наборов результатов, поэтому сложно определить, когда закрывать оператор при выполнении запроса CALL. Следствием этого является то, что MySQL Workbench 5.2 не не закрывает оператор, а если вы попытаетесь выполнить другой запрос (CALL или SELECT), он выдаст ошибку:

Команды не синхронизированы; Вы не можете запустить эту команду сейчас.

MySQL не поддерживает несколько одновременных открытых запросов. Поэтому последний должен быть закрыт, прежде чем вы сможете начать новый. Но это не закрывает запрос CALL. Эта ошибка также регистрируется на сайте MySQL.


Исправлена ​​ошибка, связанная с несинхронизацией команд. Говорят, это исправлено в MySQL Workbench 5.2.11.

0 голосов
/ 04 декабря 2009

Попробуйте поместить блоки BEGIN и END вокруг нескольких операторов в блоке IF следующим образом:

IF quota > 0 THEN
    BEGIN
        OPEN c_artist;
        REPEAT
        FETCH c_artist INTO artist_id,releases;
        IF NOT done THEN
            IF releases >= quota THEN
                UPDATE CD SET CD.rating='favourite' WHERE CD.is_fronted_by = artist_id;
            END IF;
        END IF;
        UNTIL done END REPEAT;
        CLOSE c_artist;
    END;
ELSE
    SELECT CONCAT('\'quota\' must be greater than 0.',' Got (',quota,')'); 
END IF;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...