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 如何创建列表列表的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL - 在 Where In 子句中使用“列表”变量
Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表