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了。

  • 相关阅读:
    20080619 SQL SERVER 输入 NULL 的快捷键
    20090406 Adobe的“此产品的许可已停止工作”错误的解决办法
    20080908 Office Powerpoint 2007 不能输入中文的解决办法
    20080831 ClearGertrude Blog Skin 's cnblogs_code class
    20080603 Facebook 平台正式开放
    20080519 安装 Microsoft SQL Server 2000 时提示 创建挂起的文件操作
    test
    Linux—fork函数学习笔记
    SOA的设计理念
    Why BCP connects to SQL Server instance which start with account of Network Service fail?
  • 原文地址:https://www.cnblogs.com/dyc0113/p/4724031.html
Copyright © 2011-2022 走看看