2015-01-07 64 views
0

我編寫了一個函數來選擇隊列中的某些通量並使用更新的標誌鎖定它們。 我用光標做了它,它工作得很好。但我需要獲得我鎖定的流量的ID,以便在我的應用程序中處理它們。獲取PLSQL函數的值數組

所以我開始編寫一個函數:

CREATE OR REPLACE Function getIDArray 
    RETURN VARCHAR2 is 
    arr varchar2(1000); 

      CURSOR flux_to_process               
      IS                    
      SELECT FLUX_ID, LOCKED_FLAG 
      FROM (
       SELECT FLUX_ID, FLUX, GROUP_STORE_ID, STORE_ID, REFID, FLUX_TYPE, LOCKED_FLAG 
       FROM DEV_ISB_TRANSACTIONS.BUFFER_FLUX          
       WHERE status = 0               
       AND LOCKED_FLAG = 0                            
       ORDER BY DATE_CREATION ASC) 
      WHERE ROWNUM <= 8; 

      BEGIN                   

      FOR flux_rec IN flux_to_process             
       LOOP                   
       IF flux_rec.LOCKED_FLAG = 0 
       THEN  

       UPDATE DEV_ISB_TRANSACTIONS.BUFFER_FLUX          
       SET LOCKED_FLAG = 1               
       WHERE FLUX_ID = flux_rec.FLUX_ID; 
       arr := flux_rec.FLUX_ID; 

       else exit; 
      COMMIT;                   
      END IF; 
      END LOOP; 
      RETURN arr; 
     END; 

的函數編寫返回OK,但我沒有回我的價值觀。

你們有什麼線索怎麼做?

+0

如果您的遊標查詢只返回一行,爲什麼使用遊標和循環? ('WHERE ROWNUM <= 1') – Aramillo

+0

因爲它可以返回多於一行,實際上它是我應用程序中的一個變量。我編輯了這個問題:) – Xavier

+3

@angezanetti也許我錯了,但乍一看,所有這些對於一個簡單的任務似乎都過於複雜。難道你不能只使用一個請求來做所有這些工作嗎?UPDATE ... WHERE ... IN(SELECT ...)RETURNING ... BLUK COLLECT INTO ...'(http://docs.oracle.com/ cd/B19306_01/appdev.102/b14261/returninginto_clause.htm#CJAGFGDE) –

回答

1

關於您的問題本身,只有兩個原因,我可以看到該函數返回「沒有價值」將是兩種:

  • SELECT部分返回集,
  • 你有一個記錄FLUX_IDNULL

對於不可能的,可能是在給定列的名稱稍後選項,這將是相當一致的事實是,你在每次迭代重寫的結果 - 與ORDER BY訂單NULL後,默認情況下不可─NULL

+0

該選擇返回8個值,FLUX_ID從不是NULL ...我重寫了請求在這裏(更新工作正常)https://stackoverflow.com/questions/27836393/return-values-of-update-request-plsql – Xavier