2015-01-07 62 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