2014-01-10 96 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 = ""不正確,這永遠不會返回true。

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

用NULL連接任何字符串將返回NULL。


回覆您的評論:

您已經命名自己的變量type_idtype_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