【问题标题】:The best way to fill varray in different code blocks pl sql在不同的代码块pl sql中填充varray的最佳方法
【发布时间】:2019-03-19 08:38:07
【问题描述】:

通常我这样填充数组:

TYPE name_options IS VARRAY(6) OF VARCHAR2(300);
dd_name_options_c name_options;

dd_name_options_c := name_options(string1, string2, string3, string4);

但是如果我有两个生成字符串的块并且我想将所有字符串保存到一个数组中:

-- Block 1
....
dd_name_options_c := name_options(string1, string2, string3, string4);
....
-- Block 2
....
dd_name_options_c := name_options(string5, string6);

所以,最后,数组将包含 6 个字符串: 字符串1、字符串2、字符串3、字符串4、字符串5、字符串6

我该怎么做?

【问题讨论】:

    标签: oracle plsql user-defined-types


    【解决方案1】:

    你可以使用extend

    declare
      TYPE name_options IS VARRAY(6) OF VARCHAR2(300);
      dd_name_options_c name_options;
    
    begin
      dd_name_options_c := name_options('a', 'b', 'c', 'd');
    
      dd_name_options_c.Extend(2);
      dd_name_options_c(5) := 'e';
      dd_name_options_c(6) := 'f';
    
      dbms_output.put_line(dd_name_options_c.count());
    end;
    /
    

    【讨论】:

      【解决方案2】:

      如果我有两个生成字符串的块,我想将所有字符串保存到一个数组中

      如果块是单独的程序单元或以其他方式断开连接,甚至可以以不同的顺序执行,您需要一些逻辑来判断目标数组是否已经填充。一种解决方案是使用(私有)PL/SQL 过程来管理它。

      procedure populate_varray 
           ( p_tgt in out name_options
             , p_new in name_options)
      is
         n pls_integer;
      begin
         if p_tgt is null 
               or p_tgt.count() = 0 
         then
           p_tgt := p_new;
         elsif  p_new is not null 
               and p_new.count() > 0
         then 
           n := p_tgt.count();
           for idx in 1 .. p_new.count() loop
             p_tgt.extend();
             p_tgt(n + idx) := p_new(idx);
           end loop;
         end if;
      end populate_varray;
      

      注意:未经测试的代码,如有错误请在下方评论:)

      你可以这样称呼它:

      -- Block 1
      ....
      populate_varray ( dd_name_options_c 
                        , name_options(string1, string2, string3, string4));
      ....
      -- Block 2
      ....
      populate_varray (dd_name_options_c  
                        , name_options(string5, string6) );
      

      【讨论】:

      • 谢谢。在不久的将来它可能会有所帮助。到现在为止,我的块已经连接得差不多了。
      • 在循环中我更喜欢使用类似p_tgt.last() 的东西作为扩展后的索引
      • @hotfix - 很公平。我不记得上次在现实生活中使用 VARRAY 是什么时候了(与堆栈溢出相反)。嵌套表更好用;例如,我们可以使用 MULTISET UNION 轻松解决这个问题。
      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2012-01-18
      相关资源
      最近更新 更多