Как получить вложенную таблицу при использовании объединения - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь получить данные из вложенной таблицы в виде sql, но когда я хочу добавить объединение, оракул говорит inconsistent data type.).

Когда я делаю:

    CREATE OR REPLACE FORCE VIEW MY_VIEW
(
    VAR_1,
    VAR_2,
    VAR_3,
    VAR_4,
    VAR_5
)
    BEQUEATH DEFINER
AS
    SELECT 
           '0-0'            CHILD_ENTITY_ID,
           NULL             PARENT_ENTITY_ID,
           T2.LEVEL_ID      ENTITY_ID,
           NULL             PARENT_LEVEL_TYPE_ID,
          (SELECT ALERT_DAYS FROM TABLE(T6.ALERT_DAYS)) ALERT_DAYS
      FROM MA_TABLE_1    T1,
           MA_TABLE_2    T2,
           MA_TABLE_3    T3,
           MA_TABLE_4    T4,
           MA_TABLE_5    T5,
           MA_TABLE_6    T6,
           MA_TABLE_7    T7
     WHERE     T1.LEVEL_TYPE_ID = 0
           AND T1.LEVEL_TYPE_ID = T2.LEVEL_TYPE_ID
           AND T4.RATE_ID = T2.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T2.ALERT_ID = T6.ALERT_ID(+)
           AND T2.RATE_ID = T7.RATE_ID
    UNION
    SELECT 
           '1-' || T2.OPERATOR_ID CHILD_ENTITY_ID,
           '0-0'                  PARENT_ENTITY_ID,
           T2.OPERATOR_ID         ENTITY_ID,
           0                      PARENT_LEVEL_TYPE_ID,
          (SELECT ALERT_DAYS FROM TABLE(T6.ALERT_DAYS)) ALERT_DAYS
      FROM MA_TABLE_3             T2,
           MA_TABLE_2             T3,
           MA_TABLE_4             T4,
           MA_TABLE_5             T5,
           MA_TABLE_6             T6,
           MA_TABLE_7             T7
     WHERE     ((T3.LEVEL_TYPE_ID = 1 AND T3.LEVEL_ID = T2.OPERATOR_ID))
           AND T3.LEVEL_TYPE_ID =
                   (SELECT MAX (T4.LEVEL_TYPE_ID)
                      FROM SMS_MONITORING_THRESHOLD T4
                     WHERE ((T4.LEVEL_TYPE_ID = 1
                           AND T4.LEVEL_ID = T2.OPERATOR_ID))
                           AND T4.RATE_ID = T3.RATE_ID
                           AND T3.CHANNEL_ID = T4.CHANNEL_ID)
           AND T4.RATE_ID = T3.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T3.ALERT_ID = T6.ALERT_ID(+)
           AND T3.RATE_ID = T7.RATE_ID;

Я получил сообщение об ошибке "неправильные типы данных".

Я также пытался добавить to_char (... ALERT_DAYS), но безуспешно.

Мне удалось избежать ошибки с этим обновлением:

    CREATE OR REPLACE FORCE VIEW MY_VIEW
(
    VAR_1,
    VAR_2,
    VAR_3,
    VAR_4,
    VAR_5
)
    BEQUEATH DEFINER
AS
    SELECT 
           '0-0'            CHILD_ENTITY_ID,
           NULL             PARENT_ENTITY_ID,
           T2.LEVEL_ID      ENTITY_ID,
           NULL             PARENT_LEVEL_TYPE_ID,
          T8.*
      FROM MA_TABLE_1    T1,
           MA_TABLE_2    T2,
           MA_TABLE_3    T3,
           MA_TABLE_4    T4,
           MA_TABLE_5    T5,
           MA_TABLE_6    T6,
           MA_TABLE_7    T7,
           TABLE(T2.ALERT_DAYS) T8
     WHERE     T1.LEVEL_TYPE_ID = 0
           AND T1.LEVEL_TYPE_ID = T2.LEVEL_TYPE_ID
           AND T4.RATE_ID = T2.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T2.ALERT_ID = T6.ALERT_ID(+)
           AND T2.RATE_ID = T7.RATE_ID
    UNION
    SELECT 
           '1-' || T2.OPERATOR_ID CHILD_ENTITY_ID,
           '0-0'                  PARENT_ENTITY_ID,
           T2.OPERATOR_ID         ENTITY_ID,
           0                      PARENT_LEVEL_TYPE_ID,
          T8.*
      FROM MA_TABLE_3             T2,
           MA_TABLE_2             T3,
           MA_TABLE_4             T4,
           MA_TABLE_5             T5,
           MA_TABLE_6             T6,
           MA_TABLE_7             T7,
           TABLE(T3.ALERT_DAYS) T8
     WHERE     ((T3.LEVEL_TYPE_ID = 1 AND T3.LEVEL_ID = T2.OPERATOR_ID))
           AND T3.LEVEL_TYPE_ID =
                   (SELECT MAX (T4.LEVEL_TYPE_ID)
                      FROM SMS_MONITORING_THRESHOLD T4
                     WHERE ((T4.LEVEL_TYPE_ID = 1
                           AND T4.LEVEL_ID = T2.OPERATOR_ID))
                           AND T4.RATE_ID = T3.RATE_ID
                           AND T3.CHANNEL_ID = T4.CHANNEL_ID)
           AND T4.RATE_ID = T3.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T3.ALERT_ID = T6.ALERT_ID(+)
           AND T3.RATE_ID = T7.RATE_ID;

Но сейчасмой взгляд ничего не возвращает, и я не понимаю, почему, если у вас есть идеи, пожалуйста, дайте мне знать

1 Ответ

0 голосов
/ 14 октября 2019

вы можете попробовать это

CREATE OR REPLACE FORCE VIEW MY_VIEW 
(
    ID,
    ALERT_DAYS
)
   BEQUEATH DEFINER
AS
    SELECT
         T1.ID,
         SELECT ALERT_DAYS FROM TABLE(to_number(T1.ALERT_DAYS)) ALERT_DAYS
    FROM 
        MA_TABLE T1
   UNION
    SELECT
         T1.ID,
         SELECT ALERT_DAYS FROM TABLE(to_number(T1.ALERT_DAYS)) ALERT_DAYS
    FROM 
        MA_TABLE T1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...