2016-09-16 2 views
0

ファイル名に基づいてテーブルからレコードをフェッチするカーソルがあります(ファイル名は配列から渡されます)。ファイル名がテーブルに複数回存在する場合、duparrayにそのような回数だけファイル名を追加する必要があります。PLSQL:カーソルの行カウントを取得し、カウントに基づいて配列に追加する

たとえば、test2.txtが2回存在し、test3.txtが3回存在する場合、duparrayを {test2.txt、test2.txt、test3.txt、test3.txt、test3}とする必要があります。 txt}

しかし、私はROWCOUNT> 1のチェックをしているので、duparrayは {test2.txt、test3.txt、test3.txt}となっています。

このチェックがない場合は、テーブルに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; 

アンその後、arrayを埋めるためにfor loopを使用.. 。

あなたはこれが必要なファイル名の問題はすでにコレクション内にある対応していない

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; 

を使用することができます。この場合

NEVER USE A LOOP TO DO A SELECT'S JOB 

、しかし:

2

データベースプログラミング状態のボブの第一法則おそらくファイル名の集合は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です。

配列の必要性に応じて、ファイル名でインデックスされたカウントの連想配列にすることができます。つまり、それぞれのファイル名を1回だけ保存し、それぞれのファイル名を保持するので、test3.txtを3回保存するのではなく、filecounts('test3.txt') = 3となります。

関連する問題