Oracle PL/SQL 如何创建列表列表

Posted

技术标签:

【中文标题】Oracle PL/SQL 如何创建列表列表【英文标题】:Oracle PL/SQL How to create list of lists 【发布时间】:2018-11-14 09:43:25 【问题描述】:

在 python 中,我们创建复杂的数组,例如:

[['element1',['element2',['element3'],
['element1',['element2',['element3'],
['element1',['element2',['element3']]

在 PL/SQL 中有没有办法做到这一点?

【问题讨论】:

你可以有集合的集合,或者包含集合的对象类型的集合......你可能需要解释你实际上想要实现的目标。 ***.com/questions/9155742/… 【参考方案1】:

您可以对 Oracle 类型使用继承来拥有多个嵌套集合:

Oracle 设置

CREATE TYPE collect_abstract_type IS OBJECT(
  isCollection NUMBER(1,0),
  MEMBER FUNCTION toString RETURN CLOB
) NOT FINAL NOT INSTANTIABLE
/

CREATE TYPE collect_element_type UNDER collect_abstract_type (
  value VARCHAR2(20),
  OVERRIDING MEMBER FUNCTION toString
    RETURN CLOB,
  CONSTRUCTOR FUNCTION collect_element_type(value VARCHAR2)
    RETURN SELF AS RESULT
)
/

CREATE TYPE BODY collect_element_type AS
  OVERRIDING MEMBER FUNCTION toString
    RETURN CLOB
  IS
  BEGIN
    RETURN '"' || SELF.value || '"';
  END;

  CONSTRUCTOR FUNCTION collect_element_type(value VARCHAR2)
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.isCollection := 0;
    SELF.value := value;
    RETURN;
  END;
END;
/

CREATE OR REPLACE TYPE collect_abstract_type_table IS TABLE OF collect_abstract_type
/

CREATE TYPE collect_list_type UNDER collect_abstract_type (
  items collect_abstract_type_table,
  OVERRIDING MEMBER FUNCTION toString
    RETURN CLOB,
  CONSTRUCTOR FUNCTION collect_list_type
    RETURN SELF AS RESULT,
  CONSTRUCTOR FUNCTION collect_list_type(items collect_abstract_type_table)
    RETURN SELF AS RESULT
)
/

CREATE TYPE BODY collect_list_type AS
  OVERRIDING MEMBER FUNCTION toString
    RETURN CLOB
  IS
    p_string CLOB;
    p_first  BOOLEAN := TRUE;
  BEGIN
    p_string := '[';
    FOR i IN 1 .. SELF.items.count LOOP
      IF p_first THEN
        p_first := FALSE;
      ELSE
        p_string := p_string || ',';
      END IF;
      IF SELF.items(i) IS NULL THEN
        p_string := p_string || 'NULL';
      ELSE
        p_string := p_string || SELF.items(i).toString;
      END IF;      
    END LOOP;
    p_string := p_string || ']';
    RETURN p_string;
  END;

  CONSTRUCTOR FUNCTION collect_list_type
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.isCollection := 1;
    SELF.items := collect_abstract_type_table();
    RETURN;
  END;

  CONSTRUCTOR FUNCTION collect_list_type(items collect_abstract_type_table)
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.isCollection := 1;
    IF items IS NULL THEN
      SELF.items := collect_abstract_type_table();
    ELSE
      SELF.items := items;
    END IF;
    RETURN;
  END;
END;
/

然后你可以这样做:

SELECT collect_list_type(
         collect_abstract_type_table(
           collect_element_type( 'Element1' ),
           collect_list_type(
             collect_abstract_type_table(
               collect_element_type( 'Element2' ),
               collect_list_type()
             )
           ),
           NULL,
           collect_element_type( 'Element4' )
         )
       ).toString() AS list
FROM   DUAL;

哪些输出:

LIST
--------------------------------------------
["Element1",["Element2",[]],NULL,"Element4"]

【讨论】:

以上是关于Oracle PL/SQL 如何创建列表列表的主要内容,如果未能解决你的问题,请参考以下文章

从XML到Oracle PL / SQL环境中的路径列表

如何通过pl sql函数从表中生成列表?

PL/SQL - 在 Where In 子句中使用“列表”变量

Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?

oracle PL/SQL里面, tnsnames.ora文件里面配置了之后, 在下拉列表框里面没有显示