2009-05-27 6 views
0

Es ist nur für Test,seltsames Problem mit mysql gespeichert Funktion

aber ziemlich seltsam:

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

Warum führen Sie die Funktion concat() aus, wenn Ihre Funktion 'get_idiscussion_ask' heißt? –

+0

Kopieren Paste Fehler ... sollte diese Funktion aufrufen, und es gibt Null zurück. – omg

Antwort

1

sollten Sie tun

Select Result 
+0

aktualisiert..sorry für Tippfehler – omg

1

1) Sie Ihre Funktion in Ihrem Beispiel nicht aufrufen .

2) etwas mit null ergibt null verketten

+0

Ich habe meine Ausgabe aktualisiert, sorry für Tippfehler .. – omg

0

Sie ... Concat eine Null und eine Reihe ..., die eine Null ist. Was hat die gespeicherte Prozedur damit zu tun, wenn Sie sie nicht einmal anrufen?

+0

yup, es ist meine Schuld nicht zu haben zweiten Blick auf das, was vor sich geht .. – omg

0

, wenn Sie dies ändern:

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; 

zu

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; 

Sie sollten keine Probleme haben, mit CONCATing nulls

auch ich frage mich, ob dieser Teil
where idiscussion.iask_id=iask_id;
gibt keinen Namenskonflikt vielleicht sollten Sie den Parameter ändern er
iask_id bis
piask_id
(aber ich bin mir da nicht sicher).