2009-05-27 97 views
0

這只是用於測試,與MySQL存儲功能的奇怪問題

但很奇怪:

DELIMITER | 

DROP FUNCTION IF EXISTS get_idiscussion_ask| 

CREATE FUNCTION get_idiscussion_ask(iask_id INT UNSIGNED) RETURNS TEXT DETERMINISTIC 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE body varchar(600); 
    DECLARE created DATETIME; 
    DECLARE anonymous TINYINT(1); 
    DECLARE screen_name varchar(64); 
    DECLARE result TEXT; 
    DECLARE cur1 CURSOR FOR SELECT body,created,anonymous,screen_name from idiscussion left join users on idiscussion.uid=users.id where idiscussion.iask_id=iask_id; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    SET result = ''; 
    OPEN cur1; 
    REPEAT 
    FETCH cur1 INTO body, created, anonymous, screen_name; 
    SET result = CONCAT(result,'<comment><body><![CDATA[',body,']]></body>','<replier>',if(screen_name is not null and !anonymous,screen_name,''),'</replier>','<created>',created,'</created></comment>'); 
    UNTIL done END REPEAT; 
    CLOSE cur1; 

    RETURN result; 
END | 

DELIMITER ; 

mysql> DELIMITER ; 
mysql> select get_idiscussion_ask(1); 
+------------------------+ 
| get_idiscussion_ask(1) | 
+------------------------+ 
| NULL     | 
+------------------------+ 
1 row in set (0.01 sec) 



mysql> SELECT body,created,anonymous,screen_name from idiscussion left join users on idiscussion.uid=users.id where idiscussion.iask_id=1; 
+------+---------------------+-----------+-------------+ 
| body | created    | anonymous | screen_name | 
+------+---------------------+-----------+-------------+ 
| haha | 2009-05-27 04:57:51 |   0 | NULL  | 
| haha | 2009-05-27 04:57:52 |   0 | NULL  | 
| haha | 2009-05-27 04:57:52 |   0 | NULL  | 
| haha | 2009-05-27 04:57:53 |   0 | NULL  | 
+------+---------------------+-----------+-------------+ 
4 rows in set (0.00 sec) 
+0

如果你的函數被稱爲'get_idiscussion_ask',你爲什麼要運行concat()函數? – 2009-05-27 00:25:27

+0

複製粘貼錯誤... 應該調用這個函數,它返回null .. – omg 2009-05-27 00:57:22

回答

1

你應該做

Select Result 
+0

updated..sorry爲錯字 – omg 2009-05-27 17:39:37

1

1)你是不是要求你的函數在你的榜樣。

2)在空

+0

我已經更新我的版本,對錯字抱歉.. – omg 2009-05-27 17:39:21

0

連接在一起而空結果什麼,你... CONCAT在空和串......這是一個零。如果你甚至不打電話,存儲過程與它有什麼關係?

0

如果你改變這一點:

DECLARE cur1 CURSOR FOR 
    SELECT body,created,anonymous,screen_name 
    FROM idiscussion 
    LEFT JOIN users ON idiscussion.uid=users.id 
    WHERE idiscussion.iask_id=iask_id; 

DECLARE cur1 CURSOR FOR SELECT 
ifnull(body,'') 
,ifnull(created,now())  
,ifnull(anonymous,0) 
,ifnull(screen_name,'') 
FROM idiscussion 
LEFT JOIN users on idiscussion.uid=users.id 
WHERE idiscussion.iask_id=iask_id; 

你不應該有任何問題CONCATing空

我也想知道,如果這部分
where idiscussion.iask_id=iask_id;
不給名稱衝突也許你應該改變參數呃
iask_id到
piask_id
(但我不確定那部分)。