【Oracle】IS TABLE OF和BULK COLLECT INTO+FORALL

- 日理万妓 2023-06-21 13:27 19阅读 0赞
  • IS TABLE OF :指定是一个集合的表的数组类型,简单的来说就是一个可以存储一列多行的数据类型。
  • INDEX BY BINARY_INTEGER:指索引组织类型。
  • BULK COLLECT :指是一个成批聚合类型,简单的来说 , 它可以存储一个多行多列存储类型,采用BULK COLLECT可以将查询结果一次性地加载到集合中。

【type】在SCOTT模式下,使用IS TABLE OF获取所有员工的姓名,职务,工资信息。

  1. declare
  2. type type_ename is table of emp.ename%type;
  3. type type_job is table of emp.job%type;
  4. type type_sal is table of emp.sal%type;
  5. var_ename type_ename:=type_ename();
  6. var_job type_job:=type_job();
  7. var_sal type_sal:=type_sal();
  8. begin
  9. select ename,job,sal
  10. bulk collect into var_ename,var_job,var_sal
  11. from emp;
  12. /*输出雇员信息*/
  13. for v_index in var_ename.first .. var_ename.last loop
  14. dbms_output.put_line('雇员名称:'||var_ename(v_index)||' 职务:'||var_job(v_index)||' 工资:'||var_sal(v_index));
  15. end loop;
  16. end;

【rowtype】在SCOTT模式下,使用IS TABLE OF获取所有员工的所有信息。

  1. declare
  2. type emp_table_type is table of emp%rowtype index by binary_integer;
  3. var_emp_table emp_table_type;
  4. begin
  5. select *
  6. bulk collect into var_emp_table
  7. from emp;
  8. /*输出雇员信息*/
  9. for i in 1..var_emp_table.COUNT loop
  10. dbms_output.put_line('雇员名称:'||var_emp_table(i).ename||' 职务:'||var_emp_table(i).job||' 工资:'||var_emp_table(i).sal);
  11. end loop;
  12. end;

在Oracle开发中,有时我们会使用BULK COLLECT INTO批量操作大量的数据,如果没有LIMIT限制,则Oracle会读取查询的所有记录行到内存中,这样很容易造成PGA溢出而导致出现错误。所以使用LIMIT关键字可以避免PGA溢出。

  1. SQL> DECLARE
  2. 2 TYPE typ_emp IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER;
  3. 3 v_emp typ_emp;
  4. 4
  5. 5 v_emp_id tab_emp_id;
  6. 6 v_total_id tab_emp_id := tab_emp_id();
  7. 7
  8. 8 v_limit NUMBER := 3;
  9. 9
  10. 10 v_test emp%ROWTYPE;
  11. 11
  12. 12 CURSOR cur_emp IS
  13. 13 SELECT * FROM emp;
  14. 14 BEGIN
  15. 15 OPEN cur_emp;
  16. 16
  17. 17 LOOP
  18. 18 FETCH cur_emp BULK COLLECT
  19. 19 INTO v_emp LIMIT v_limit;
  20. 20
  21. 21 FORALL j IN v_emp.first .. v_emp.last
  22. 22 INSERT INTO t_emp
  23. 23 VALUES
  24. 24 (seq_emp.nextval,
  25. 25 v_emp(j).ename)
  26. 26 RETURNING id BULK COLLECT INTO v_emp_id;
  27. 27
  28. 28 v_total_id := v_total_id MULTISET UNION ALL v_emp_id;
  29. 29 EXIT WHEN v_emp.count < v_limit;
  30. 30
  31. 31 END LOOP;
  32. 32
  33. 33 CLOSE cur_emp;
  34. 34
  35. 35 FOR rec IN (SELECT *
  36. 36 FROM t_emp
  37. 37 WHERE id IN (SELECT column_value FROM TABLE(v_total_id)))
  38. 38 LOOP
  39. 39 dbms_output.put_line(rec.id || '---------->' || rec.name);
  40. 40 END LOOP;
  41. 41
  42. 42 COMMIT;
  43. 43
  44. 44 END;
  45. 45 /
  46. 86---------->SMITH_
  47. 87---------->ALLEN
  48. 88---------->WARD
  49. 89---------->JONES
  50. 90---------->MARTIN
  51. 91---------->BLAKE
  52. 92---------->CLARK
  53. 93---------->SCOTT
  54. 94---------->KING
  55. 95---------->TURNER
  56. 96---------->ADAMS
  57. 97---------->JAMES
  58. 98---------->FORD
  59. 99---------->MILLER
  60. PL/SQL procedure successfully completed.

参考:

《Oracle中IS TABLE OF的使用》
《Oracle BULK COLLECT INTO批量操作应用》

发表评论

表情:
评论列表 (有 0 条评论,19人围观)

还没有评论,来说两句吧...

相关阅读