批量收集Oracle
如果从表B将数据插入表A中,并且在选择数据时,substr、instr、trunc函数已用于获取的列,是否可以进行批量收集批量收集Oracle,oracle,oracle11g,Oracle,Oracle11g,如果从表B将数据插入表A中,并且在选择数据时,substr、instr、trunc函数已用于获取的列,是否可以进行批量收集 INSERT INTO A SELECT DISTINCT SUBSTR(b.component, 1, INSTR(b.component, ':', 1) - 1), TRUNC(c.end_dt, 'DDD'), FROM B b, C c WHERE TRUNC(c.end_dt)=TRUNC(b.last_Date,
INSERT INTO A
SELECT
DISTINCT
SUBSTR(b.component, 1, INSTR(b.component, ':', 1) - 1),
TRUNC(c.end_dt, 'DDD'),
FROM
B b,
C c
WHERE
TRUNC(c.end_dt)=TRUNC(b.last_Date, 'DDD') ;
如何使用大容量收集将数据插入表A?使用大容量收集和FORALL插入行的唯一原因是当您绝对需要在块中处理/插入行时。否则,请始终使用SQL
DECLARE
CURSOR c_data IS
SELECT * FROM source_tab;
--
TYPE t_source_tab IS TABLE OF source_tab%ROWTYPE;
l_tab t_source_tab;
v_limit NUMBER:= 1000;
BEGIN
OPEN c_data;
LOOP
FETCH c_data BULK COLLECT INTO l_tab LIMIT v_limit;
EXIT WHEN l_tab.count = 0;
-- Insert --
FORALL i IN l_tab.first .. l_tab.last
INSERT INTO destination_tab VALUES l_tab(i);
COMMIT;
-- prints number of rows processed --
DBMS_OUTPUT.PUT_LINE ('Inserted ' || SQL%ROWCOUNT || ' rows:');
-- Print nested table of records - optional.
-- May overflow the buffer and slow down the performance if you process many rows.
-- Use for testing only and limit the rows with Rownum or Row_Number() in cursor query:
FOR i IN l_tab.FIRST..l_tab.LAST -- or l_tab.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE (l_tab(i).hire_date ||chr(9)||l_tab(i).last_name ||chr(9)||l_tab(i).first_name);
END LOOP;
END LOOP;
CLOSE c_data;
END
/
大容量收集旨在提高程序逐行处理的性能。但是您已经有了一个SQL解决方案,这几乎总是最好的方法。在这种情况下,不要使用批量收集,您已经尽了最大努力(最好是呆在SQL引擎内)。此外,除非您确定有适当的函数索引,否则不要尽可能多地重复日期。