【问题标题】:Oracle PL/SQL nested table processing comparisonOracle PL/SQL 嵌套表处理比较
【发布时间】:2017-07-17 03:05:40
【问题描述】:

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

假设我定义了以下类型:

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 嵌套表?

【问题讨论】:

  • 你没有运行它吗? LISTAGG 返回 varchar2 - docs.oracle.com/cd/E11882_01/server.112/e41084/…
  • Procedure a1 是真正的嵌套表类型,而第二个过程使用 LISTAGG 返回一个字符串,只是值用逗号分隔。
  • 好吧,正如我所怀疑的那样。有人可以帮助我如何返回一个真正的嵌套表,就像我尝试使用基于 my_members 表中的 membernos 列数据的 LISTAGG 函数一样?
  • 请显示一些示例预期输出,因为不清楚您要做什么。这里到底“嵌套”了什么?我没有看到任何层次结构。

标签: oracle plsql oracle11g


【解决方案1】:

你应该可以

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

我不会真正称它为嵌套表,除非它实际上作为集合类型存储在数据库中(我不推荐)。

【讨论】:

    【解决方案2】:

    我怀疑您是否可以通过这种方式填充嵌套表。您可以按照以下方式进行操作;

    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:未经测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2013-10-25
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多