2010-12-01 15 views
2

我有這樣的功能:MySQL存儲函數,如何檢查沒有行並且不會生成警告?

DROP FUNCTION IF EXISTS find_linkid; 
DELIMITER // 
CREATE FUNCTION `find_linkid`(pc1 VARCHAR(50) 
    RETURNS INT 
BEGIN 
    DECLARE linkId int; 
     SELECT a.id INTO linkId FROM PC_A a WHERE a.pc=pc1; 
ON   
    IF linkId IS NULL THEN 
     SELECT b.id INTO linkId FROM PC_B b WHERE b.pc=pc1; 
    END IF; 

    RETURN linkId; 
END 
// 

基本上,運行一個查詢,如果不返回任何東西(的a.id被聲明爲NOT NULL),運行另一個查詢並返回鏈路ID。如果沒有找到,linkId將爲NULL,如果pc1完全沒有找到,則返回NULL。

這工作,但給人的警告,如果第一個查詢不返回任何內容:

select find_linkid('12BD'); 
+------------------------------+ 
| find_linkid('12BD')   | 
+------------------------------+ 
|       667 | 
+------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+-----------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+-----------------------------------------------------+ 
| Warning | 1329 | No data - zero rows fetched, selected, or processed | 
+---------+------+-----------------------------------------------------+ 
1 row in set (0.00 sec) 

什麼是運行一個查詢的正確方式,如果不返回任何內容,運行另一個查詢?

回答

7

可以使用CONTINUE HANDLER趕警告,然後設置一個變量,如果你想,或者只是通過給CONTINUE HANDLER空體忽略它。

下面就來抑制警告的例子(我也是固定缺少括號,並從你的代碼中刪除外來ON):

DROP FUNCTION IF EXISTS find_linkid; 
DELIMITER // 
CREATE FUNCTION `find_linkid`(pc1 VARCHAR(50)) 
    RETURNS INT 
BEGIN 
DECLARE linkId int; 
DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END; 
     SELECT a.id INTO linkId FROM PC_A a WHERE a.pc=pc1; 
    IF linkId IS NULL THEN 
     SELECT b.id INTO linkId FROM PC_B b WHERE b.pc=pc1; 
    END IF; 

    RETURN linkId; 
END 
// 
3

試試這個處理程序:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET linkId = NULL; 
3

這裏的另一種可能性,用更少的樣板:

DECLARE _found, _id integer; 
SELECT count(*), sum(a.id) INTO _found, _id FROM PC_A AS a WHERE a.pc = pc1; 
IF _found THEN RETURN _id; END IF; 
SELECT b.id INTO _id FROM PC_B AS b WHERE b.pc = pc1; 
RETURN _id; 
相關問題