0

テスト用なので、

しかし、かなり奇妙です:

    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)
4

4 に答える 4

1

やったほうがいい

Select Result
于 2009-05-27T00:27:16.377 に答える
1

1)例では関数を呼び出していません。

2) null と何かを連結すると null になる

于 2009-05-27T00:27:21.197 に答える
0

あなたは...ヌルと文字列を連結します...これはヌルです。ストアド プロシージャを呼び出さなくても、ストアド プロシージャと何の関係があるのでしょうか。

于 2009-05-27T00:28:50.070 に答える
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に変更する必要があります
(ただし、その部分についてはわかりません)。

于 2011-03-09T22:58:03.080 に答える