2017-10-11 20 views
0

私は0行以上を返すselect文を持っています。oracle plsqlは行をチャンクします

私はカーソルを使ってxml出力を生成するplsql procを考え出しています。すべての行は一度に100行に戻されます。私は必要に応じて一度にLOOの行をチャンクするためにこれをやっています。

だから、基本的に私のプログラムは、私は、XMLテキストに、SELECT文からの出力を変換やろうとしているロジック

cursor c1 is select id,code_id,code_desc from table order by id; --returns some rows 

if c1%notfound 
    then return;` -- exit from procedure 
else 
loop 
    grab first 100 rows from select and append to a variable 
    and assign it to a variable; 
    update this variable into a clob field in a table. 
    grab next 100 rows and append into a variable 
    update this variable into a clob field in a table in another row;see below 
    table data 

    and so on 
    and grab remaining rows and append into a variable 
    print the variable; 
until no data found; 
exit 

の下に従ってください。

出力は以下のようになります。

TABLE:STG_XML_DATA

LOOP_NO(NUMBER), XML_TEXT(CLOB), ROWS_PROCESSED 
1    <XML><id>1</ID><id>2</ID>..<ID>100</ID></XML>  100 
2    <XML><id>101</ID><id>102</ID>..<ID>200</ID></XML> 200 
3    <XML><id>301</ID><id>102</ID>..<ID>320</ID></XML> 20 

は誰かが、すべての

+0

は、なぜあなたは一度のみのプロセスに100行をしようとしていますか?あなたの行がどのように見えるのか、あるいは「変数に追加する」のように見えますか?たとえば、PL/SQLコレクションに行を格納することはできますが、実際に行を印刷するのは簡単です。 – kfinity

+0

私は一度に100行をチャンクして、それをテーブルに格納できる変数に追加しようとしています。私はパターンに従ったXMLテキストを生成しています。このselect文から返された値は、その値をclob_columnに追加するために使用されます。 – user1751356

+0

ここでは、カーソルの操作に関するいくつかの有益な情報、特に検索したい行を制限する方法と、最後に到達したときを正しく知る方法について説明します(NOTFOUNDを使用するのではなく)。http:// www。 oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html –

答えて

0

ファーストを助けてください、あなたは、単一のINSERTでこれを行うことができますSELECT ...合理的なパフォーマンスであなたが望むものを実行するステートメントあなたが百万行を実行しているなら、はい、それらを塊に分割することは良いアイデアかもしれません。しかし、それが100なら、それはあなたの最善の策かもしれません。

実際の質問では、BULK COLLECTをコレクション変数に使用し、おそらくFORALLを使用します。だからあなたの関数は次のようなものを見に行くされて:あなたは絶対にしたくない

DECLARE 
    TYPE id_tt IS TABLE OF NUMBER; 
    TYPE desc_tt IS TABLE OF VARCHAR2(100); 
    l_ids   id_tt; 
    l_code_ids id_tt; 
    l_code_descs desc_tt; 
    cursor c1 is select id,code_id,code_desc from table 
BEGIN 
    OPEN c1; 
    LOOP 
     FETCH c1 BULK COLLECT INTO l_ids, l_code_ids, l_code_descs 
     LIMIT 100; 

     EXIT WHEN l_ids.COUNT = 0; 

     FORALL idx IN 1..l_ids.COUNT 
     INSERT [... some insert statement here ...] 

     [... maybe some other processing here...] 
    END LOOP; 
    CLOSE c1; 
END; 

どのようなプロセスを、行をフェッチされ、別の行をフェッチする、などのSQLは集合指向言語なので、してみてくださいセットを操作する。コンテキストをSQLからPL/SQLに切り替えるたびにコストがかかり、パフォーマンスが低下する可能性があります。

参照してください:http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

+0

こんにちはEaolson、ありがとうございました。私は現在、カーソルの次の行を処理する方法を理解していません。カーソルが行を返さない場合、プログラムは正常に終了するはずですが、カーソルに220行があり、プログラムに基づいて最初の100行がforループで処理されます。次の行はどうですか?私はこれをかなり理解していません。助けてください! – user1751356

+0

これはLOOP ... END LOOP構造体の中にありますか?これは、EXIT句が真になるまで繰り返され、毎回100行を処理します。 – eaolson

関連する問題