2016-09-16 19 views
0

我有一个游标,它根据文件名从表中提取记录(文件名从数组中传递)。现在如果文件名在表中不止一次出现,我需要将文件名添加到duparray这么多次。PLSQL:获取光标行数并添加到基于计数的数组

例如,如果test2.txt存在2次并且test3.txt存在3次,那么我需要将dupray设置为 {test2.txt,test2.txt,test3.txt,test3.txt,test3。 txt}

但是根据下面的代码,duparray会作为 {test2.txt,test3.txt,test3.txt},因为我有ROWCOUNT> 1检查。

如果该检查不存在,表中存在单个时间的文件名也会被添加到它。请告诉我应该在哪里纠正它。

CURSOR duplicateData IS 
    SELECT file_name from tablename where file_name=p_filearray(i)   
    dupRow duplicateData%rowtype; 

里面的程序:

OPEN duplicateData ; 
    loop 
    fetch duplicateData INTO dupRow; 
    EXIT WHEN duplicateData %NOTFOUND; 
     IF duplicateData %ROWCOUNT >1 
     THEN 
     p_duparray.EXTEND; 
     p_duparray(p_duparray.LAST):=dupRow.file_name; 
     END IF; 
    end loop; 
CLOSE duplicateData ; 

回答

0

我会建议收集到cursorfile_name和数量occurances的(cnt

CURSOR duplicateData IS 
select file_name,count(*) cnt from tablename where file_name=p_filearray(i) 
group by file_name; 

dupRow duplicateData%rowtype; 
i number:=0; 

的再使用for loop填补了array .. 。

OPEN duplicateData ; 
    loop 
    fetch duplicateData INTO dupRow; 
    EXIT WHEN duplicateData %NOTFOUND; 
for i in 1..dupRow.cnt loop 
     p_duparray.EXTEND; 
     p_duparray(p_duparray.LAST):=dupRow.file_name; 
end loop; 
CLOSE duplicateData ; 
2

鲍勃第一定律数据库编程状态之一:

NEVER USE A LOOP TO DO A SELECT'S JOB 

在这种情况下,你可以使用

DECLARE 
    FILENAME_COL_TYPE AS TABLE OF TABLENAME.FILENAME%TYPE INDEX BY PLS_INTEGER; 

    colFile_names ROW_COL_TYPE; 
BEGIN 
    SELECT FILE_NAME 
    BULK COLLECT INTO colFile_names 
    FROM TABLENAME 
    ORDER BY FILE_NAME; 
END; 

这并没有解决一个集合中已经是所需的文件名的问题,但据推测,文件名集合是从SELECT语句派生的,所以选择适当文件名的标准可以包含在上面。

循环不好。不放弃!决不! (什么,永不?)不,永远不会! (千万不要?)好了,几乎没有...

:-)

0

也许我失去了一些东西,但它看起来好像你什么都不做的第一循环迭代由于IF duplicateData%ROWCOUNT > 1,这是为什么你失去了第一个价值。

我会自动重构open-fetch-exit-end-close环路成简单的形式:

for r in (
    select file_name from tablename where file_name=p_filearray(i)   
) 
loop 
    p_duparray.extend; 
    p_duparray(p_duparray.last) := r.file_name; 
end loop; 

虽然鲍勃·贾维斯提到你甚至不需要一个循环只是光标结果取到一个数组,当你可以bulk collect吧。

根据您需要的数组,可能会使其成为由文件名索引的计数的关联数组。也就是说,每个文件名只存储一次,并保持每一个的计数,以便filecounts('test3.txt') = 3,而不是存储test3.txt三次。