ORACLE PL/SQL from entry to proficient in notes-collection method of records and collections (seven)

How to download this book and related resources: pay attention to the WeChat public account, click the function introduction-book link to download, you can get it

illustrate

This article mainly introduces the following knowledge points:

  • 3. Collection methods
    7.1. Using the EXISTS method
    7.2. Using the COUNT method
    7.3. Using the LIMIT method 7.4. The
    FIRST and LAST methods 7.5. The
    PRIOR and NEXT methods
    7.6. The
    EXTEND method 7.7. The TRIM method 7.8. The
    DELETE method
    7.9. Exception handling for collections

    7.10. Using bulk binding

    7.11. Using BULK COLLECT

In this article, the collection method is directly explained by code, which is easier to understand

DECLARE
  TYPE projecrlist IS VARRAY(50) OF VARCHAR2(16); --定义一个变长数组
  project_list projecrlist := projecrlist('序列1',
                                          '序列2',
                                          '序列3',
                                          '序列4',
                                          '序列5');
  TYPE idx_table IS TABLE OF VARCHAR(12) INDEX BY PLS_INTEGER; --定义一个索引表
  v_emp idx_table;
  TYPE dept_type IS VARRAY(20) OF NUMBER; --定义一个嵌套表
  dept_table dept_type := dept_type(10, 30, 70); --实例化嵌套表,分配是三个元素
  TYPE deptno_type IS TABLE OF hyz_emp.ename%TYPE; --嵌套表
  nums deptno_type; --定义嵌套表变量,暂不初始化
BEGIN
  dbms_output.put_line('---------------------exists用法---------------------');
  IF project_list.exists(5) THEN
    dbms_output.put_line('存在,其值为:' || project_list(5));
    dbms_output.put_line('---------------------limit用法---------------------');
    dbms_output.put_line('变长数组的上限数量为' || project_list.limit || '个');
    dbms_output.put_line('---------------------count用法---------------------');
    dbms_output.put_line('变长数组的当前数量为' || project_list.count || '个');
    dbms_output.put_line('---------------------first和last用法---------------------');
    dbms_output.put_line('变长数组的第一个数据下标为' || project_list.first || '个');
    dbms_output.put_line('变长数组最后个数据下标为' || project_list.last || '个');
    dbms_output.put_line('---------------------prior和next用法---------------------');
    dbms_output.put_line('project_list表上一个值是' || (project_list.prior(3)));
    dbms_output.put_line('project_list表下一个值是' || (project_list.next(3)));
    dbms_output.put_line('---------------------extend用法---------------------');
    project_list.extend; --为project_list追加一个元素
    project_list(6) := '序列6';
    dbms_output.put_line('追加了:' || project_list(6));
    project_list.extend(2); --为project_list追加两个元素
    project_list(7) := '序列7';
    project_list(8) := '序列8';
    dbms_output.put_line('追加了:' || project_list(7) || '-' ||
                         project_list(8));
    project_list.extend(3, 2); --把第二个元素赋值三份到末尾
    dbms_output.put_line('追加了三份相同的值:' || project_list(9) || '-' ||
                         project_list(10) || '-' || project_list(11));
    dbms_output.put_line('---------------------trim用法---------------------');
    dbms_output.put_line('原元素个数:' || project_list.count);
    project_list.trim(); --删除末端一个元素   
    project_list.trim(2); --删除末端两个元素      
    dbms_output.put_line('目前元素个数:' || project_list.count);
    dbms_output.put_line('---------------------delete用法(只能用于索引表和嵌套表)---------------------');
    v_emp(-10) := '小明';
    v_emp(0) := '小王';
    v_emp(10) := '小黑';
    v_emp(20) := '小白';
    v_emp(30) := '小牛';
    dbms_output.put_line('原元素个数:' || v_emp.count);
    /*    project_list.delete(2); --删除第二个元素,变长数组不支持
    project_list.delete(2,3); --删除第二到三个元素,变长数组不支持
    */
    v_emp.delete(2); --删除第二个元素,如果元素不存在,不会有操作
    v_emp.delete(3, 4); --删除第3到4的元素,如果元素不存在,不会有操作
    dbms_output.put_line('现元素个数:' || v_emp.count); --实际上没变,删除失败
    v_emp.delete(10); --删除第二个元素
    v_emp.delete(-10, 0); --删除第-10到0的元素
    dbms_output.put_line('现元素个数:' || v_emp.count); --成功删除,-10,0,10
    v_emp.delete; --删除所有元素
    dbms_output.put_line('现元素个数:' || v_emp.count);
    dbms_output.put_line('---------------------批量绑定---------------------');
    dbms_output.put_line('现元素个数:' || dept_table.count);
    --FORALL不是循环语句,所以不需要LOOP...LOOP END;
    FORALL i IN dept_table.first .. dept_table.last --循环变量嵌套表元素
      DELETE scott.emp s WHERE s.deptno = dept_table(i);
    --COMMIT;--由于是例子,可以不使用COMMIT;保持原表不变....
    ROLLBACK; --由于是例子,可以使用ROLLBACK;保持原表不变....
    SELECT s.ename
      BULK COLLECT
      INTO nums
      FROM hyz_emp s
     WHERE s.deptno = 20;
    FOR i IN 1 .. nums.count LOOP
      dbms_output.put_line('nums:(' || i || ')=' || nums(i));
    END LOOP;
  ELSE
    dbms_output.put_line('不存在');
  END IF;
END;

I am a programmer. If you think it's well organized, please pay attention to your personal WeChat public account (scan it):

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326009932&siteId=291194637