我需要實現的目標是從遊標中獲取所有記錄到集合中,以使用該遊標中的數據填充表。 不幸的是,我無法理解如何從光標獲取數據到數組中。 我嘗試過批量收集,但沒有辦法。 extend關鍵字的含義是什麼?如何從數組中獲取數據?使用Oracle PL/SQL集合
我首先聲明一個帶有必要字段的記錄。然後,我創建了一個這種類型的表格。然後我批量收集從光標到表格的所有內容。它似乎工作,但現在如何從該表中獲取數據?
我需要實現的目標是從遊標中獲取所有記錄到集合中,以使用該遊標中的數據填充表。 不幸的是,我無法理解如何從光標獲取數據到數組中。 我嘗試過批量收集,但沒有辦法。 extend關鍵字的含義是什麼?如何從數組中獲取數據?使用Oracle PL/SQL集合
我首先聲明一個帶有必要字段的記錄。然後,我創建了一個這種類型的表格。然後我批量收集從光標到表格的所有內容。它似乎工作,但現在如何從該表中獲取數據?
不確定爲什麼你在批量收集時遇到問題:它非常簡單。當我們處理數萬條記錄時,它會變得稍微困難一點,但是您不會說這是否是一個因素。無論哪種方式,您都不需要使用批量收集擴展。
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功能隨着每個版本的增加而增加,找到這樣的需求變得越來越少見。
您可以使用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的問題)
如果這不是你要找的,請發佈一段代碼來幫助解決問題。
非常感謝!您的解決方案100%工作!像你這樣解釋,這一切聽起來很清楚! :D問候,佩德羅 – Yaroze
是否有一個原因,你想選擇數據放入一個數組放入表中?您可以將遊標的結果直接插入表中,理想情況下使用insert into ... select from ...語法,這將更快,並且不需要數組。 –
我同意Stephen ODonnell使用SQL直接插入行,因爲它比使用PL/SQL遊標更有效。請參閱http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm#i2145081 – Ollie