java.sql.Types.ARRAY 来自简单的 select 语句

java.sql.Types.ARRAY from simple select statement

我有:

我需要的:

连接两个表,所以我得到一条 CI 的记录,该记录中的 parents 和 children 包含一个 Sql ARRAY(VARRAY?) .

示例:

|id | description | children | parents |
|1  | root        | [2,3]    | null    |
|2  | child1      | [3]      | [1]     |
|3  | child2      | [2]      | [1]     |

为什么我需要这个?我正在使用 Apache Nifi 将数据摄取到 Apache Solr 中,并且需要 children 和 parents 的多值字段。由于 ExecuteSQL 正在解释 sql 结果集,并以我需要的方式查找 java.sql.Types.ARRAY,因此我想要一个 select,实际上是 returns,不知何故。顺便说一句:我没有任何可能使用 PL/SQL,希望这不会使答案变得不可能...

谢谢! 亨宁

您可以在相关子查询中使用 CAST( COLLECT( ... ) AS ... ) 生成您的集合:

SQL Fiddle

Oracle 11g R2 架构设置:

CREATE TABLE CI ( id, description ) AS
SELECT 1, 'root' FROM DUAL UNION ALL
SELECT 2, 'child1' FROM DUAL UNION ALL
SELECT 3, 'child2' FROM DUAL;

CREATE TABLE CI_REL ( ci_id, child_ci_id, parent_ci_id ) AS
SELECT 1, 2, NULL FROM DUAL UNION ALL
SELECT 2, 3, 1    FROM DUAL UNION ALL
SELECT 3, NULL, 2 FROM DUAL;

CREATE TYPE NumberList IS TABLE OF Number(8,0);

查询 1:

SELECT c.*,
       ( SELECT CAST(
                  COLLECT(
                    DISTINCT child_ci_id
                    ORDER BY LEVEL
                  ) AS NumberList
                )
          FROM  CI_REL r
          WHERE child_ci_id IS NOT NULL
          START WITH r.ci_id = c.id
          CONNECT BY PRIOR child_ci_id = ci_id
       ) AS children,
       ( SELECT CAST(
                  COLLECT(
                    DISTINCT parent_ci_id
                    ORDER BY LEVEL
                  ) AS NumberList
                )
          FROM  CI_REL r
          WHERE parent_ci_id IS NOT NULL
          START WITH r.ci_id = c.id
          CONNECT BY PRIOR parent_ci_id = ci_id
        ) AS parents
FROM   CI c

Results:

| ID | DESCRIPTION | CHILDREN | PARENTS |
|----|-------------|----------|---------|
|  1 |        root |      2,3 |         |
|  2 |      child1 |        3 |       1 |
|  3 |      child2 |          |     2,1 |