Почему курсор извлекает нуль в процедуре? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь выполнить процедуру для заполнения таблицы из другой таблицы.

Но когда я вызываю процедуру, она заполняет нулями другую таблицу.

Процедураследующее:

DELIMITER //
CREATE PROCEDURE invent()
BEGIN
    DECLARE bDone INT;

    DECLARE hostname VARCHAR(100);

    DECLARE curs CURSOR FOR  
        select hostname from GetInvent;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
    DROP TABLE Persons;

    CREATE TABLE Persons (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `hostname` VARCHAR(100),
        PRIMARY KEY (`id`)
    );

    SET bDone = 0;
    OPEN curs;
    igmLoop: loop
        FETCH curs INTO hostname;

        if bDone = 1 then leave igmLoop; end if;

        INSERT INTO Persons(hostname) VALUES (hostname);

    END LOOP igmLoop;

    CLOSE curs;

    SELECT * FROM Persons;
END //
DELIMITER ;

В GetInvent есть около 50.000 записей работы цикла, потому что в таблице Persons я получаю около 50.000 после вызова процедуры, но с именем хоста равным Null.

Есть идеи?

1 Ответ

0 голосов
/ 14 ноября 2018

Я получаю ответ на эту проблему здесь: Выбор курсора MySQL NULL

Ошибка была именем переменной, и имя атрибута hostname не может быть таким же.

Процедура исправления:

DELIMITER //
CREATE PROCEDURE invent()
BEGIN
DECLARE bDone INT;

DECLARE v_hostname VARCHAR(100);

DECLARE curs CURSOR FOR  
    select hostname from GetInvent;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
DROP TABLE Persons;

CREATE TABLE Persons (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `hostname` VARCHAR(100),
    PRIMARY KEY (`id`)
);

SET bDone = 0;
OPEN curs;
igmLoop: loop
    FETCH curs INTO v_hostname;

    if bDone = 1 then leave igmLoop; end if;

    select v_hostname;

    INSERT INTO Persons(hostname) VALUES (v_hostname);

END LOOP igmLoop;

CLOSE curs;

SELECT * FROM Persons;
END //
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...