首页 文章

Oracle PL / SQL嵌套表处理比较

提问于
浏览
0

我正在使用Oracle 11gR2 PL / SQL表(嵌套表),但是对以下两种方法是否实现相同结果感到有点困惑,即:

假设我已经定义了以下TYPE:

type member_nos_type is table of varchar2(32000);

以及以下样本表定义/数据:

table: my_members

id        number not null,
membernos varchar2(30) not null,
first_nm  varchar2(255),
surname   varchar2(255)

Sample data in table my_members:

1  111111  Joe   Smith
2  222222  Sam   Smith
3  333333  Jane  Smith
4  444444  Jason Smith
5  555555  Joel  Smith

然后在一个过程中,我有以下代码:

procedure a1 (p_param1 in varchar2) is

      v_member_list        member_nos_type;

    begin
      if p_param1 = 'BASKETBALL' then
        v_member_list := member_nos_type ('222222','444444');
      end if;
    end;    
----------------------------    
    procedure b2 (p_param1 in varchar2) is

      v_member_list        member_nos_type;

    begin
      if p_param1 = 'BASKETBALL' then
        v_member_list := member_nos_type (
          SELECT LISTAGG(membernos, ',') WITHIN GROUP (ORDER BY membernos)
          FROM my_members
          WHERE id in (2,4));
      end if;
    end;

基于上面的 procedure a1procedure b2 ,最终结果是varchar2类型的成员数表吗?

更新

如何根据my_members表中的membernos列数据返回TRUE嵌套表?

2 回答

  • 0

    你应该能够

    select cast(collect(membernos) as member_nos_type)
    into v_member_list 
    FROM my_members
    WHERE id in (2,4);
    

    我不会把它称为嵌套表,除非它实际上存储为数据库中的集合类型(我不推荐) .

  • 0

    我怀疑你是否可以填充嵌套表 . 你可以这样做;

    procedure b2 (p_param1 in varchar2) is
    
          v_member_list        member_nos_type;
    
        begin
          if p_param1 = 'BASKETBALL' then
          for rec in (Select membernos
                      from my_members
                      WHERE id in (2,4))
          loop
           v_member_list.extend();     
           v_member_list(rec):= rec.membernos;    
    
          End loop;   
          end if;
    
          For i in 1..v_member_list.count
          loop
    
           dbms_output.put_line(v_member_list(i));
    
          end loop;
    
        end;
    

    PS:未经测试 .

相关问题