Существует ли функция PL / SQL для подсчета количества n подтипов супертипа? - PullRequest
1 голос
/ 02 октября 2019

Есть ли в PL / SQL функция, которая может считать количество n подтипов таблицы (супертип)?

Я пробовал следующее:

select
    count(distinct value(t1))
from table t1;

select
    count(distinct treat(value(t1))
from table t1;

В основном,если таблица имеет 6 подтипов, я бы хотел запрос, который мог бы вывести 6.

1 Ответ

2 голосов
/ 02 октября 2019

Настройка Oracle :

CREATE TYPE parent_type AS OBJECT( id NUMBER ) NOT FINAL;
CREATE TYPE child1_type UNDER parent_type ( c1 NUMBER );
CREATE TYPE child2_type UNDER parent_type ( c2 NUMBER ) NOT FINAL;
CREATE TYPE child3_type UNDER child2_type ( c3 NUMBER );

CREATE TABLE test_data ( value parent_type );

INSERT INTO test_data ( value )
  SELECT parent_type( 1 ) FROM DUAL UNION ALL
  SELECT child1_type( 2, 1 ) FROM DUAL UNION ALL
  SELECT child1_type( 3, 1 ) FROM DUAL UNION ALL
  SELECT child1_type( 4, 1 ) FROM DUAL UNION ALL
  SELECT child2_type( 5, 2 ) FROM DUAL UNION ALL
  SELECT child2_type( 6, 2 ) FROM DUAL UNION ALL
  SELECT child3_type( 7, 3, 1 ) FROM DUAL UNION ALL
  SELECT child3_type( 8, 3, 1 ) FROM DUAL UNION ALL
  SELECT child3_type( 9, 3, 1 ) FROM DUAL;

Запрос 1 :

Если вы знаете иерархию типов, вы можете создать запрос вручную, используятот факт, что TREAT( object AS type ) вернет NULL, если объект, который вы передаете, не относится к этому типу и может использовать оператор CASE и начинать с листьев дерева иерархии и обрабатывать типы от самой глубокой глубины наследования дородительский тип:

SELECT COUNT( DISTINCT
         CASE
         WHEN TREAT( value AS child3_type ) IS NOT NULL
           THEN 'child3_type' -- deepest subtype
         WHEN TREAT( value AS child2_type ) IS NOT NULL
           THEN 'child2_type' -- supertype of child3_type, subtype of parent_type
         WHEN TREAT( value AS child1_type ) IS NOT NULL
           THEN 'child1_type' -- subtype of parent_type
         ELSE 'parent_type'
         END
       ) AS num_types
FROM   test_data

Запрос 2 :

Если у вас есть доступ к типу SYS.ANYDATA , вы можете получитьтип объекта :

SELECT COUNT(
         DISTINCT
         SYS.ANYDATA.getTypeName(
           SYS.ANYDATA.convertObject( value )
         )
       ) AS num_types
FROM   test_data

Выход :

Оба дают одинаковый вывод:

| NUM_TYPES |
| --------: |
|         4 |

дБ <> скрипка здесь

...