2015-02-26 176 views
0

我在DB2中有一些存儲過程。一些代碼行(INSERT,UPDATE等)。經過一些操作,我有IF條件,打開/不打開CURSOR。由於某些原因,即使IF條件爲TRUE,CURSOR也不會打開。 CURSOR之前的所有代碼都可以正常工作。如果我將它刪除,所以CURSOR會正常工作。如果我將CURSOR放在單獨的SP中,它可以正常工作(從這個SP中調用另一個SP)。但由於某種原因,它們不起作用。我不明白爲什麼。我需要這個IF條件的代碼。在代碼後打開遊標

這是它的外觀(僅1個一行INSERT光標左側外):

DECLARE C1 CURSOR WITH HOLD FOR 
SELECT s.KEY, s.CODE, s.PRODUCT, s.AMOUNT 
FROM DB2ADMIN.SALES s, DB2ADMIN.PRODUCTS p 
WHERE s.DATE_KEY = CDC AND s.PRODUCT_KEY = p.PRODUCT_KEY; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
SET EOF = 1; 

    INSERT INTO DB2ADMIN.IA_BASE_SALES_TMP (SOME_FIELD) VALUES (SOME_VALUE); 

    IF true THEN 
     OPEN C1; 
     WHILE EOF = 0 DO 

     FETCH FROM C1 INTO SP_KEY, SP_CODE, SP_KEY, SP_PRODUCT, SP_AMOUNT; 

     MERGE INTO DB2ADMIN.IA_BASE_SALES_TMP t 
     USING (
       SELECT POS, p.KEY, s.TELLER, s.TYPE, s.AMOUNT, s.CDC 
       FROM DB2ADMIN.COMMISSIONS s, DB2ADMIN.PRODUCTS p 
       WHERE TELLER = SP_TELLER AND TYPE = SP_TYPE 
     ) e ON t.TELLER_KEY = e.TELLER_ID   
      WHEN matched   
     THEN UPDATE SET t.KEY = e.KEY, t.UPD = 0; 

     END WHILE; 
     CLOSE C1; 

    END IF; 
+0

難道你不能把所有的光標放在if語句中嗎?另外,一般來說,您可以擺脫遊標並堅持使用相關邏輯(需要付出一點努力,但它在性能上會付出代價)。 – jean

+0

遊標的脫機必須位於代碼之前。我試過:(我怎樣才能擺脫遊標?我需要得到幾行並循環雖然他們 –

+1

程序員使用遊標,因爲他們習慣於用命令式邏輯思考(從命令式語言如C,Java,PHP等)關係數據庫管理系統確實使用關係邏輯,但我不知道現在的時間,但我相信你可以擺脫那個光標,只是堅持選擇,連接和臨時表 – jean

回答

0

感謝Jean。

用FOR循環替換遊標,一切正常。