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;
難道你不能把所有的光標放在if語句中嗎?另外,一般來說,您可以擺脫遊標並堅持使用相關邏輯(需要付出一點努力,但它在性能上會付出代價)。 – jean
遊標的脫機必須位於代碼之前。我試過:(我怎樣才能擺脫遊標?我需要得到幾行並循環雖然他們 –
程序員使用遊標,因爲他們習慣於用命令式邏輯思考(從命令式語言如C,Java,PHP等)關係數據庫管理系統確實使用關係邏輯,但我不知道現在的時間,但我相信你可以擺脫那個光標,只是堅持選擇,連接和臨時表 – jean