zoukankan      html  css  js  c++  java
  • Oracle PL/SQL 嵌套表的使用

    PL/SQL当中有一个常用的容器,nested Table,在项目开发中,需要借用容器来实现一些计算操作,PL/SQL并不想其他语言当中有一些数组等比较容易使用的容器,在此整理一下nested tables一些常用的操作。

    一、简介

    netsted tables 可以看成一个变长数组,可以存放任意数量的元素(只要内存足够大),通过下标来实现对元素的访问,nested tables 有点是可以在SQL中直接使用。

                

                                        nested table 内存存储模型

    nested tables 为了提高删除元素的效率,元素删除后并不移动后续的元素,从图中可以看nested tables 的下标是从1开始的,这点跟其它语言的数组或者容器有些区别。

    (1) 定义。

       TYPE  tb_table IS TABLE OF VARCHAR2(100) ;    --定义一个嵌套表格类型存储 字符型数据

        tb_instance  tb_table:=tb_table();                    -- 采用上面定义的类型顶一个一个对象。

     (2)添加元素

        tb_instance.extend(1);--在末尾扩充一个元素

        tb_instance(tb_instance.last):=i; --为末尾的元素赋值

     (3) 删除元素

      tb_instance.delete(index);  --删除元素

    (4)迭代器

      由于nested tables 元素的删除仅仅是留下一个空槽,元素遍历时我们要跳过这些空槽,nested table有以下的属性来访问存在的元素

       Fist : 第一个存在的元素下标

       Last:  最后一个存在的元素下标   

       exists(index): 判断下标index的元素是否存在

      NEXT(index):  获取 index下标后存在元素的下标,如果index是最后一个元素,则返回NULL

      PRIOR(index):  获取 index下标前面存在元素的下标,如果index是第一个元素,则返回NULL

      以上操作属性方法的存在可以让我们实现对Nested tables 的遍历了

       示例代码如下:

    DECLARE
      -- Local variables here
      i INTEGER;
    
      counter INTEGER;
      TYPE tb_table IS TABLE OF VARCHAR2(100);
      tb_instance tb_table := tb_table(); 
      PROCEDURE log(l VARCHAR2) IS
      BEGIN
        dbms_output.put_line(l);
      END;
    
      PROCEDURE remove_depulate(p_tb_instance IN OUT tb_table) IS
        i INTEGER;
        j INTEGER;
      BEGIN
        i := p_tb_instance.first;
        WHILE i IS NOT NULL LOOP
          j := p_tb_instance.next(i);
          WHILE j IS NOT NULL LOOP
            IF p_tb_instance(i) = p_tb_instance(j) THEN
              p_tb_instance.delete(i);
              EXIT;
            END IF;
          
            j := p_tb_instance.next(j);
          END LOOP;
        
          i := p_tb_instance.next(i);
        END LOOP;
      END;
    
    BEGIN
    
      FOR i IN 1 .. 10 LOOP    --每个元素增加两次
        tb_instance.extend(1);
       tb_instance.extend(1); tb_instance(tb_instance.last) :
    = i; log('last:' || tb_instance.last); tb_instance(tb_instance.last) := i; END LOOP; remove_depulate(tb_instance); --去掉容器中重复的元素 log('-------------------------------------------------------'); counter := tb_instance.first; --通过属性方法遍历容器当中的元素 WHILE counter IS NOT NULL LOOP dbms_output.put_line('Element #' || counter || ' = ' || tb_instance(counter)); counter := tb_instance.next(counter); END LOOP; END;

    上面的代码使用到了容器的增加,删除,遍历操作,修改操作直接通过下标访问修改就OK了。

  • 相关阅读:
    HTTP 错误 404.13
    C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名
    设计模式---装饰模式(Decorator)
    设计模式---订阅发布模式(Subscribe/Publish)
    Merge into 详细介绍
    优化案例--多语句表值函数的影响
    常用脚本--Kill所有连接到指定数据库上的回话
    常用脚本--查看当前锁信息
    常用脚本--查看死锁和阻塞usp_who_lock
    常用脚本--在线重建或重整实例下所有索引
  • 原文地址:https://www.cnblogs.com/dyc0113/p/4724031.html
Copyright © 2011-2022 走看看