Oracle Forall
admin
2023-05-02 18:44:18
0

FORALL

Note:[from official document]

Example 12-7DELETE Statement in FOR LOOP Statement

DROP TABLE employees_temp;
CREATE TABLE employees_temp AS SELECT *FROM employees;
 
DECLARE
 TYPE NumList IS VARRAY(20) OF NUMBER;
 depts NumList := NumList(10, 30, 70); -- department numbers
BEGIN
  FORi IN depts.FIRST..depts.LAST LOOP
   DELETE FROM employees_temp
   WHERE department_id = depts(i);
  ENDLOOP;
END;
/

Example 12-9Time Difference for INSERT Statement in FOR LOOP and FORALL Statements

DROP TABLE parts1;
CREATE TABLE parts1 (
 pnum INTEGER,
 pname VARCHAR2(15)
);
 
DROP TABLE parts2;
CREATE TABLE parts2 (
 pnum INTEGER,
 pname VARCHAR2(15)
);
 
DECLARE
 TYPE NumTab IS TABLE OF parts1.pnum%TYPE INDEX BY PLS_INTEGER;
 TYPE NameTab IS TABLE OF parts1.pname%TYPE INDEX BY PLS_INTEGER;
 pnums   NumTab;
 pnames  NameTab;
 iterations  CONSTANT PLS_INTEGER:= 50000;
 t1  INTEGER;
 t2  INTEGER;
 t3  INTEGER;
BEGIN
  FORj IN 1..iterations LOOP  -- populatecollections
   pnums(j) := j;
   pnames(j) := 'Part No. ' || TO_CHAR(j);
  ENDLOOP;
 
  t1:= DBMS_UTILITY.get_time;
 
  FORi IN 1..iterations LOOP
   INSERT INTO parts1 (pnum, pname)
   VALUES (pnums(i), pnames(i));
  ENDLOOP;
 
  t2:= DBMS_UTILITY.get_time;
 
 FORALL i IN 1..iterations
   INSERT INTO parts2 (pnum, pname)
   VALUES (pnums(i), pnames(i));
 
  t3:= DBMS_UTILITY.get_time;
 
 DBMS_OUTPUT.PUT_LINE('Execution Time (secs)');
 DBMS_OUTPUT.PUT_LINE('---------------------');
 DBMS_OUTPUT.PUT_LINE('FOR LOOP: ' || TO_CHAR((t2 - t1)/100));
 DBMS_OUTPUT.PUT_LINE('FORALL:   '|| TO_CHAR((t3 - t2)/100));
 COMMIT;
END;
/
Result is similar to:
 
Execution Time (secs)
---------------------
FOR LOOP: 2.16
FORALL:  .11
 
PL/SQL procedure successfully completed.

Example 12-10FORALL Statement for Subset of Collection

DROP TABLE employees_temp;
CREATE TABLE employees_temp AS SELECT *FROM employees;
 
DECLARE
 TYPE NumList IS VARRAY(10) OF NUMBER;
 depts NumList := NumList(5,10,20,30,50,55,57,60,70,75);
BEGIN
 FORALL j IN 4..7
   DELETE FROM employees_temp WHERE department_id = depts(j);
END;
/

Example 12-26DELETE with RETURN BULK COLLECT INTO in FORALL Statement

DROP TABLE emp_temp;
CREATE TABLE emp_temp AS
SELECT * FROM employees
ORDER BY employee_id, department_id;
 
DECLARE
 TYPE NumList IS TABLE OF NUMBER;
 depts  NumList :=NumList(10,20,30);
 
 TYPE enum_t IS TABLE OF employees.employee_id%TYPE;
 e_ids  enum_t;
 
 TYPE dept_t IS TABLE OF employees.department_id%TYPE;
 d_ids  dept_t;
 
BEGIN
 FORALL j IN depts.FIRST..depts.LAST
   DELETE FROM emp_temp
   WHERE department_id = depts(j)
   RETURNING employee_id, department_id
   BULK COLLECT INTO e_ids, d_ids;
 
 DBMS_OUTPUT.PUT_LINE ('Deleted ' || SQL%ROWCOUNT || ' rows:');
 
  FORi IN e_ids.FIRST .. e_ids.LAST
 LOOP
   DBMS_OUTPUT.PUT_LINE (
     'Employee #' || e_ids(i) || ' from dept #' || d_ids(i)
   );
  ENDLOOP;
END;
/

 

Deleted 9 rows:

Employee #200 from dept #10

Employee #201 from dept #20

Employee #202 from dept #20

Employee #114 from dept #30

Employee #115 from dept #30

Employee #116 from dept #30

Employee #117 from dept #30

Employee #118 from dept #30

Employee #119 from dept #30


相关内容

热门资讯

冰箱漏电怎么测 1、可以用灯泡检查法来检测冰箱漏电,将36V灯泡的两根导线,一根接冰箱外壳(无漆处)另一根接大地,如...
电饭煲通电就跳闸怎么回事 如果之前电饭煲从未出现过跳闸现象,此现象为新出现的,有可能是插板或者是电饭煲发生故障导致的。首先可以...
空调外机有温度传感器损坏 最可能是温度传感器泄漏导致的这个原因。可以使用热毛巾加热温度检测管,将按钮设置为最低温度,并使用测试...
九阳铁釜电饭煲故障代码种类及解... 故障代码的种类很多,有E0表示电饭煲上盖热敏电阻故障,需要更换上盖的热门电阻;E1是热敏电阻故障,需...
九阳电饭锅的拆卸步骤 先拆锅底的四个小螺丝,然后将暴露出来的底拆开,然后拆卸电饭锅那儿的小盖板,用螺丝刀拆螺丝就行,然后将...
华南理工男生课堂偷拍女生被当场... 据羊城晚报消息,5月13日,一段“华南理工大学男生教室偷拍女生”视频在网络传播,相关事件引发热议。视...
偷税超900万被查的网红白冰:... 刚刚,因偷税超900万元被查的网红白冰发布近60分钟长视频,控诉前员工联合他人侵吞公司资金、设局陷害...
AI人才需求攀升,如何打开就业... 当前正值高校毕业生求职关键期。记者在劳动力市场看到,随着人工智能蓬勃发展,各行业各领域对AI(人工智...
5月14日、15日土星火星上演... 5月14日、15日土星火星上演合月“接力赛” 5月14日、15日日出前,东方低空将接连上演土星合月...
投身具身智能,它石丁文超:知行... 90后、“天才少年”、博导...它石智航首席科学家丁文超身上有不少标签。他曾参与主导真正意义上的第一...