【问题标题】:How can I return a CSV string from PL/SQL table type in Oracle如何从 Oracle 中的 PL/SQL 表类型返回 CSV 字符串
【发布时间】:2012-06-15 09:44:23
【问题描述】:

我已经定义了一个表类型的 PL/SQL 变量并在那里添加了一些数据。

create or replace type varTableType as table of varchar2(32767);
my_table varTableType := varTableType()
...
my_table := some_function();

现在我有了这个包含数千条记录的my_table 表类型变量。 我必须只选择那些以特定字符结尾的记录,比如 'a' 并以逗号分隔的字符串获得结果。 我认为 COLLECT 函数可以做到这一点,但我不明白究竟如何。 我正在使用 Oracle 10g。

【问题讨论】:

    标签: string oracle types plsql collect


    【解决方案1】:

    无需进入问题 - 为什么使用表类型而不是表(或临时表),您可以这样做:

    declare
      my_table varTableType;
      i varchar2(32767);
    begin
      my_table := new
                  varTableType('bbbb', 'ccca', 'ddda', 'eee', 'fffa', 'gggg');
    
      select trim(xmlagg(xmlelement(e, column_value || ','))
                  .extract('//text()'))
        into i
        from table(my_table)
       where column_value like '%a';
    
      dbms_output.put_line(i);
    
    end;
    

    有更多的方法来连接行-WM_CONCAT(如果启用)或LISTAGG(从 11g R2 开始)但是

    select column_value 
    from table(my_table) 
    where column_value like '%a';
    

    留下


    还有另一种不用sql的方法:

    declare
      my_table varTableType;
      i varchar2(32767);
    begin
      my_table := new
                  varTableType('bbbb', 'ccca', 'ddda', 'eee', 'fffa', 'gggg');
    
      FOR j IN my_table.first .. my_table.last LOOP
    
         IF my_table(j) like '%a' THEN
            i := i || my_table(j);
         END IF;
    
      END LOOP;
    
      dbms_output.put_line(i);
    
    end;
    

    【讨论】:

    • 谢谢,你的例子完美地满足了我的需求。不知何故,我迷失了方向,并认为所需的解决方案会更复杂。
    【解决方案2】:

    请参阅此blog post by Tim Hall,了解执行此操作的多种方法,具体取决于 Oracle 版本。

    【讨论】:

      猜你喜欢
      • 2015-11-29
      • 2014-02-28
      • 2011-07-27
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2018-08-26
      相关资源
      最近更新 更多