2014-01-10 5 views
2

Я хочу создать таблицу динамической, но моя построенная строка для создания таблицы NULL - почему?
Цель состоит в том, чтобы получить значения столбцов из существующей таблицы и создать новую таблицу с столбцами с этими значениями.Динамический SQL-запрос в процедуре

DELIMITER $$ 
DROP PROCEDURE IF EXISTS fanart_test.get_incomplete_artwork $$ 
CREATE PROCEDURE fanart_test.get_incomplete_artwork() 
BEGIN 
DECLARE finished INTEGER DEFAULT 0; 
DECLARE type_id INT; 
DECLARE type_name INT; 
DECLARE build_string VARCHAR(20000); 

DECLARE cursor1 CURSOR FOR 
    SELECT type_id,type_name FROM fanart_types WHERE type_section = 3; 


DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

OPEN cursor1; 

get_results: LOOP 
    FETCH cursor1 INTO type_id, type_name; 
    IF finished = 1 
    THEN LEAVE get_results; 
    END IF; 

    IF build_string = "" 
    THEN SET build_string = CONCAT('CREATE TABLE `tmp_incomplete_artwork`(`', type_name, '` TEXT'); 
    ELSE SET build_string = CONCAT(build_string,',', type_name); 
    END IF; 

    SET build_string = CONCAT(build_string,')'); 

END LOOP get_results; 
CLOSE cursor1; 

SET @s = build_string; 
PREPARE build FROM @s; 
EXECUTE build; 
DEALLOCATE PREPARE build; 

END $$ 

ответ

1
DECLARE build_string VARCHAR(20000); 

build_string не установлен ни к чему изначально, так что это, вероятно, будет NULL.

IF build_string = "" 

Это никогда не возвращает истину, так как NULL = "" не так.

ELSE SET build_string = CONCAT(build_string,',', type_name); 

Конкатенация любой строки с NULL возвращает NULL.


Re ваш комментарий:

Вы назвали переменные type_id и type_name, которые являются такими же, как ваши имена столбцов в таблице. Это создает двусмысленность, и оказывается, что MySQL предпочитает интерпретировать идентификаторы как локальные переменные, а не имена столбцов.

Так что:

SELECT type_id,type_name FROM fanart_types WHERE type_section = 3; 

Возвратит текущее значение TYPE_ID и type_name, который неинициализированным, т.е. NULL. Поэтому пара NULL возвращается для всех строк таблицы.

Просто переименовать переменные, чтобы быть отличным от имен столбцов вашей таблицы, либо квалифицировать столбцы, чтобы они четко столбцы вместо переменных:

SELECT f.type_id, f.type_name FROM fanart_types f WHERE f.type_section = 3; 

Кроме того, вы, вероятно, хотите, чтобы объявить type_name, как TEXT вместо INT ,

Смежные вопросы