2015-02-08 101 views
0

我有一個數據表rel_user_article調用存儲過程不起作用

+---------+------------+ 
| user_id | article_id | 
+---------+------------+ 
|  1 |   -1 | 
|  97 |  153 | 
+---------+------------+ 

此表意味着接下來的邏輯設置:每個作者必須至少有1條和每篇文章必須至少有1個作者。當作者沒有文章時,比表必須有假關係:(uid,-1)

當作者添加他的第一篇文章比這個假關係必須被刪除。

我已經存儲了創建新關係和刪除假關係的過程。 刪除假的關係是這樣的:

CREATE PROCEDURE `rel_delete_fake`(IN `ids` TEXT, IN `tbl` VARCHAR(255), 
IN `fake_f` VARCHAR(255), IN `real_f` VARCHAR(255)) 
     MODIFIES SQL DATA 
    proc: begin 
     if (`ids` = '') then 
      leave proc; 
     end if; 

     set @s = concat('DELETE FROM ', `tbl`, ' WHERE (', `fake_f`, 
         ' = "-1" AND ', `real_f`, ' IN (', `ids`, '))'); 

     prepare qr from @s; 
     execute qr; 
     deallocate prepare qr; 
    end proc 

創建「真實」的關係是這樣的:

CREATE DEFINER=`root`@`localhost` PROCEDURE `rel_create`(IN `ids1` TEXT, 
IN `ids2` TEXT, IN `tbl` VARCHAR(255), IN `field1` VARCHAR(255), 
IN `field2` VARCHAR(255)) 
    MODIFIES SQL DATA 
proc: begin 
    set @cur = 0; 
    set @id1_cur = 0; 
    set @id2_cur = 0; 

    set @id1_cur_old = NULL;  
    set @id2_cur_old = NULL; 

    if (`ids1` = '' or `ids2` = '') then 
     leave proc; 
    end if; 

    set @sql_str = concat('insert into ', `tbl`, ' (', `field1`, ', ', `field2`, ") values (?, ?)"); 
    prepare qr from @sql_str; 
    loop1: loop 
     set @cur = @cur + 1; 
     set @id1_cur = substring_index(substring_index(`ids1`, ',', @cur), ',', -1); 
     set @id2_cur = substring_index(substring_index(`ids2`, ',', @cur), ',', -1); 

     if (@id1_cur = @id1_cur_old and @id2_cur = @id2_cur_old) then 
      leave proc; 
     end if; 

     execute qr using @id1_cur, @id2_cur; 

     set @id1_cur_old = @id1_cur; 
     set @id2_cur_old = @id2_cur; 
    end loop loop1; 
    deallocate prepare qr; 

     -- deleting fake records that became needless 
     -- even this doesn't work 
    call `rel_delete_fake`('1','rel_user_article','article_id','user_id'); 
    leave proc; 

    -- deleting fake records that became needless 
    call `rel_delete_fake`(`ids1`, `tbl`, `field2`, `field1`); 
    call `rel_delete_fake`(`ids2`, `tbl`, `field1`, `field2`); 
end proc 

程序刪除假關係的作品。創建關係的過程只會創建新記錄,但不會調用rel_delete_fake過程。

爲了測試我發出下一個電話:

call `rel_create`('1','153','rel_user_article','user_id','article_id'); 

,並在結果:

+---------+------------+ 
| user_id | article_id | 
+---------+------------+ 
|  1 |   -1 | 
|  1 |  153 | 
|  97 |  153 | 
+---------+------------+ 

爲什麼這樣(1,-1)不會被刪除?

回答

0

我發現了錯誤。必須有「離開循環1」。代替「離開proc」;循環中。