Как найти, к какому столбцу какой LOB присоединен в столбце Oracle12c XMLTYPE?

#oracle #oracle12c #xmltype #data-dictionary #lob

#Oracle #oracle12c #xmltype #словарь данных #подбросить

Вопрос:

У меня есть таблица ниже с двумя столбцами XMLTYPE (ERROR_FLAG, COL_XML) и одним столбцом LOB (LOG_TEXT)

 CREATE TABLE APPLICATION_LOG
(
  ID                    NUMBER                  NOT NULL,
  LOG_TIME              TIMESTAMP(6)            NOT NULL,
  ERROR_FLAG            XMLTYPE,
  LOG_TEXT              CLOB,
  COL_XML               XMLTYPE,
  LOG_MESSAGETYPE       VARCHAR2(30 BYTE)       NOT NULL
)
XMLTYPE COL_XML STORE AS SECUREFILE BINARY XML (
  TABLESPACE users
  ENABLE      STORAGE IN ROW
  CHUNK       8192
  NOCACHE
  NOLOGGING)
ALLOW NONSCHEMA
DISALLOW ANYSCHEMA
LOB (LOG_TEXT) STORE AS BASICFILE (
  TABLESPACE  users
  ENABLE      STORAGE IN ROW
  CHUNK       8192
  PCTVERSION  10
  NOCACHE
  NOLOGGING)
NOCOMPRESS 
TABLESPACE users
;
 

Если я выполняю запрос ниже, я получаю три строки

 SELECT * 
  FROM dba_lobs l 
 WHERE l.table_name  = 'APPLICATION_LOG'
   AND l.owner = 'SYSTEM'
 

введите описание изображения здесь

Как узнать, для какого столбца XMLTYPE предназначен первый LOB (ERROR_FLAG ИЛИ COL_XML), потому что их имена теперь генерируются системой?
Как найти SYS_NC00004 $ —-> соответствует чему?

Ответ №1:

Вы можете использовать такое самосоединение с помощью dba_tab_cols (или user_tab_cols исследования только для текущего пользователя) словарного представления, такого как

 SELECT c2.data_type, c2.column_name, c1.data_type, c1.column_name
  FROM dba_tab_cols c1
  JOIN dba_tab_cols c2  
    ON c1.segment_column_id = c2.column_id  
   AND c1.table_name = c2.table_name 
   AND c2.data_type = 'XMLTYPE'
 WHERE c1.table_name = 'APPLICATION_LOG'
 

Demo