2017-10-11 199 views
0

我有一個select語句返回0或更多行。oracle plsql分塊行

我想用一個遊標想出一個plsql proc來產生xml輸出,所有行一次返回100行。我這樣做是爲了根據需求在一段時間內分塊排列。

所以基本上我的程序應遵循以下邏輯

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 

我試圖做的SELECT語句的輸出轉換成XML文本。

輸出應該類似於下面:

表: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行將在循環中被處理。下一組行如何?我很明白這一點。請幫忙! – user1751356

+0

它在LOOP ... END LOOP結構中,對吧?這將重複,直到EXIT子句爲真,每次處理100行。 – eaolson