2011-11-22 55 views
1

我需要實現的目標是從遊標中獲取所有記錄到集合中,以使用該遊標中的數據填充表。 不幸的是,我無法理解如何從光標獲取數據到數組中。 我嘗試過批量收集,但沒有辦法。 extend關鍵字的含義是什麼?如何從數組中獲取數據?使用Oracle PL/SQL集合

我首先聲明一個帶有必要字段的記錄。然後,我創建了一個這種類型的表格。然後我批量收集從光標到表格的所有內容。它似乎工作,但現在如何從該表中獲取數據?

+6

是否有一個原因,你想選擇數據放入一個數組放入表中?您可以將遊標的結果直接插入表中,理想情況下使用insert into ... select from ...語法,這將更快,並且不需要數組。 –

+0

我同意Stephen ODonnell使用SQL直接插入行,因爲它比使用PL/SQL遊標更有效。請參閱http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm#i2145081 – Ollie

回答

5

不確定爲什麼你在批量收集時遇到問題:它非常簡單。當我們處理數萬條記錄時,它會變得稍微困難​​一點,但是您不會說這是否是一個因素。無論哪種方式,您都不需要使用批量收集擴展。

SQL> SQL> SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2  type r_tmp is record 
    3   (empno number 
    4   , deptno number 
    5   , sal number); 
    6  type nt_emp is table of r_tmp; 
    7  emp_recs nt_emp; 
    8 begin 
    9  select e.empno 
10    , e.deptno 
11    , e.sal 
12  bulk collect into emp_recs 
13  from emp e; 
14  dbms_output.put_line('no of recs selected = '||emp_recs.count); 
15  forall i in emp_recs.first..emp_recs.last 
16   insert into temp_emp 
17   values emp_recs(i); 
18  dbms_output.put_line('no of recs inserted = '||sql%rowcount); 
19* end; 
20/
no of recs selected = 17 
no of recs inserted = 17 

PL/SQL procedure successfully completed. 

SQL> 

正如你可以看到,從嵌套表的簽名匹配表的項目是不在話下插入記錄。另外,如果記錄實際上與現有的表匹配,我們可以用%ROWTYPE語法來聲明嵌套表,而不是使用%ROWTYPE語法。

1 declare 
    2  type nt_emp temp_emp%rowtype; 
    3  emp_recs nt_emp; 
    4 begin 

散裝收集和FORALL更有效,正常RBAR實現,但他們仍然比較低迷純SQL。所以通常我們只會使用這種構造,我們正在對數組進行一些中間數據操作,而這本身不能在SQL中完成。隨着Oracle的SQL功能隨着每個版本的增加而增加,找到這樣的需求變得越來越少見。

4

您可以使用BULK COLLECT來填充一個數組(或在記錄的pl/sql表中)。
這樣:

set serveroutput on 
declare 
    type xyz is record(colA number , 
        colB Date) ; 
    type xyz_table is table of xyz; 

    p_xyz_table xyz_table ; 

begin 
    select level, sysdate+level 
      bulk collect into p_xyz_table 
     from dual 
     connect by level < 15 ; 
     dbms_output.put_line('records=>' || p_xyz_table.count); 
     FOR i IN 1 .. p_xyz_table.COUNT LOOP 
      dbms_output.put_line(' colA=> ' || p_xyz_table(i).colA || '; colB=>' || p_xyz_table(i).colB); 
     end loop ; 
end ; 
/

results: 
records=>14 
colA=> 1; colB=>23/11/11 09:20:00 
colA=> 2; colB=>24/11/11 09:20:00 
colA=> 3; colB=>25/11/11 09:20:00 
colA=> 4; colB=>26/11/11 09:20:00 
colA=> 5; colB=>27/11/11 09:20:00 
colA=> 6; colB=>28/11/11 09:20:00 
colA=> 7; colB=>29/11/11 09:20:00 
colA=> 8; colB=>30/11/11 09:20:00 
colA=> 9; colB=>01/12/11 09:20:00 
colA=> 10; colB=>02/12/11 09:20:00 
colA=> 11; colB=>03/12/11 09:20:00 
colA=> 12; colB=>04/12/11 09:20:00 
colA=> 13; colB=>05/12/11 09:20:00 
colA=> 14; colB=>06/12/11 09:20:00 

退房的文檔@http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm,它已經來到了真正的方便,我過去。 (這也將回答你關於EXTEND的問題)

如果這不是你要找的,請發佈一段代碼來幫助解決問題。

+0

非常感謝!您的解決方案100%工作!像你這樣解釋,這一切聽起來很清楚! :D問候,佩德羅 – Yaroze