2016-09-16 24 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三次。