【问题标题】:Linearize Oracle nested table线性化 Oracle 嵌套表
【发布时间】:2010-11-29 01:32:42
【问题描述】:

如何线性化嵌套表,嵌套表本身也包含嵌套表(注意:内部表的大小可能不同)。假设我有以下类型声明:

CREATE OR REPLACE TYPE VECTOR
IS
  TABLE OF NUMBER;

CREATE OR REPLACE TYPE TABLE_OF_VECTOR
IS
  TABLE OF VECTOR;

以及PL/SQL的以下sn-p:

DECLARE
  number_table TABLE_OF_VECTOR;
  result_vector VECTOR;
BEGIN
  number_table := table_of_vector(vector(23, 4, 2222, 22222222),
    vector(2, 1, 766, 2), vector(2, 1, 5));
END;

有没有一种方法可以线性化 number_table 并将其所有值存储在 result_vector 中作为一个连续的数字列表?我想结束:

result_vector == vector(23, 4, 2222, 22222222, 2, 1, 766, 2, 2, 1, 5)

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    确实如此,但并不漂亮。

    select cast(collect(b.column_value) as vector) 
    from  table(table_of_vector(
                 vector(23, 4, 2222, 22222222), 
                 vector(2, 1, 766, 2), 
                 vector(2, 1, 5))) a, 
          table(a.column_value) b;
    

    因此 table(...) 部分将 table_of_vector 视为“常规”表,其中包含名为“COLUMN_VALUE”的列。然后我们将其视为另一个我称之为 B 的表。

    SELECTed 表达式获取构成“A”表中的“B”表的所有单个数字,并将它们聚合到一个集合中(使用 COLLECT)。最后,我明确地将集合转换为 VECTOR 类型。

    【讨论】:

    • 非常感谢,正是我要找的单行字。
    • 附带一个问题:从性能的角度来看,哪种方法最好(与 for 循环解决方案相比)?在我未经训练的眼里,这个看起来像一个笛卡尔连接。
    【解决方案2】:
    DECLARE
      number_table TABLE_OF_VECTOR;
      result_vector VECTOR:=vector();
    BEGIN
      number_table := table_of_vector(vector(23, 4, 2222, 22222222),
        vector(2, 1, 766, 2), vector(2, 1, 5));
    for i in number_table.first .. number_table.last loop
       for  j in number_table(i).first .. number_table(i).last loop
         result_vector.extend();
         result_vector(result_vector.count):=number_table(i)(j);
      end loop;
    end loop;
    for i in 1.. result_vector.count loop
        dbms_output.put_line(result_vector(i));
    end loop;
    END;
    /
    

    【讨论】:

    • 谢谢,只是想知道:有没有办法在一次选择中做到这一点?喜欢:选择 result_vector ... 对我来说,理想的情况是 Oracle 有一些内部机制来执行此操作。对我来说,这几乎感觉像是一次未收集(和重新包装)。不知道Oracle是否支持。
    猜你喜欢
    • 2022-01-21
    • 2016-08-07
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2013-05-23
    • 2020-03-23
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多