String 如何从Oracle中的PL/SQL表类型返回CSV字符串

String 如何从Oracle中的PL/SQL表类型返回CSV字符串,string,oracle,types,plsql,collect,String,Oracle,Types,Plsql,Collect,我已经定义了一个表类型PL/SQL变量,并在其中添加了一些数据 create or replace type varTableType as table of varchar2(32767); my_table varTableType := varTableType() ... my_table := some_function(); 现在我有了这个my_tabletable类型变量,它包含数千条记录。 我必须只选择那些以特定字符结尾的记录,比如'a',然后以逗号分隔的字符串获取结果。 我认

我已经定义了一个表类型PL/SQL变量,并在其中添加了一些数据

create or replace type varTableType as table of varchar2(32767);
my_table varTableType := varTableType()
...
my_table := some_function();
现在我有了这个
my_table
table类型变量,它包含数千条记录。 我必须只选择那些以特定字符结尾的记录,比如'a',然后以逗号分隔的字符串获取结果。 我认为COLLECT函数可以做到这一点,但我不清楚具体是如何做到的。
我使用的是Oracle 10g。

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

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;
有更多的方法来连接行-(如果启用)或(自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;

不必回答这个问题-为什么要使用表类型而不是表(或临时表),您可以这样做:

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;
有更多的方法来连接行-(如果启用)或(自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;

根据Oracle版本的不同,请参阅此部分了解实现此目的的多种方法。

根据Oracle版本的不同,请参阅此部分了解实现此目的的多种方法。

谢谢,您的示例完美地满足了我的需要。不知怎的,我迷路了,以为所需的解决方案会更复杂。谢谢你,你的例子完美地满足了我的需求。不知怎的,我迷失了方向,认为所需的解决方案会更复杂。