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、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...