Я хочу запросить всю таблицу с CLOB, который имеет JSON внутри - PullRequest
0 голосов
/ 21 мая 2019

Я собираю данные из удаленных баз данных в центральную базу данных. В удаленных базах данных я выполняю несколько запросов и использую PLJSON для записи результатов в структуры данных JSON (JSON_LIST). Затем данные вставляются в промежуточную таблицу в моей центральной базе данных.

CREATE TABLE SSP_STAGE_DB_GATHER
(
  ID              NUMBER  NOT NULL,
  DB_NAME         VARCHAR2(20 BYTE)             NOT NULL,
  DB_UNIQUE_NAME  VARCHAR2(20 BYTE)             NOT NULL,
  RESULT_TYPE     VARCHAR2(20 BYTE)             NOT NULL,
  LOADED_AT       DATE                          NOT NULL,
  JSON_RESULT     CLOB                          NOT NULL
)
LOB (JSON_RESULT) STORE AS SECUREFILE (
  TABLESPACE  AUT_DB_GATHER_LOB)
TABLESPACE AUT_DB_GATHER 

Когда сбор данных запущен в моих базах данных, результат в этой таблице выглядит примерно так

ID DB_NAME DB_UNIQUE_NAME RESULT_TYPE LOADED_AT JSON_RESULT 
1  D4081T  D4081T_CCH     FRA         21/5/2019 13:30:33    (HUGECLOB)
2  D4081T  D4081T_CCH     TABLESPACE  21/5/2019 13:30:33    (HUGECLOB)
3  D4081T  D4081T_CCH     PATCH_INFO  21/5/2019 13:30:33    (HUGECLOB)
21  D2647O D2647O     FRA         21/5/2019 13:43:04    (HUGECLOB)
22  D2647O D2647O     TABLESPACE  21/5/2019 13:43:05    (HUGECLOB)
23  D2647O D2647O     PATCH_INFO  21/5/2019 13:43:05    (HUGECLOB)

Я могу запрашивать каждую строку, но я хотел бы запросить все строки для (например) RESULT_TYPE = TABLESPACE.

Я могу запросить по ID = 22

SELECT *
  FROM TABLE (pljson_table.json_table ( (SELECT  JSON_RESULT
                                           FROM SSP_STAGE_DB_GATHER
                                          WHERE id = 22),
                                       pljson_varray ('[*].Tablespace',
                                                      '[*].LOGGING',
                                                      '[*].BIGFILE',
                                                      '[*].USED_MB',
                                                      '[*].FREE_MB',
                                                      '[*].TOTAL_MB',
                                                      '[*].PRC_FREE'),
                                       pljson_varray ('Tablespace',
                                                      'logging',
                                                      'bigfile',
                                                      'used',
                                                      'free',
                                                      'total',
                                                      'pct'),
                                       table_mode   => 'nested'))
   where pct >99

(не обращайте внимания на "где pct> 99". Это просто для ограничения вывода)

, что приводит к

    TABLESPACE           LOGGING  BIGFILE  USED    FREE    TOTAL   PCT    
    -------------------- -------- -------- ------- ------- ------- -----
    AUT_DB_GATHER        LOGGING  YES      0       100     100     100    
    AUTOMATION_TRAINING  LOGGING  YES      0       100     100     100    
    AUT_DB_GATHER_LOB    LOGGING  YES      0       100     100     100    
    STAGING              LOGGING  YES      0       100     100     100   
   4 rows selected.

В приведенном выше примере я должен использовать ID = 22, потому что "TABLE (pljson_table.json_table" ожидает 1 значение (один объект clob / один объект json).

Я хотел бы запрос, который будет искать всю мою таблицу на основе RESULT_TYPE='TABLESPACE' и для каждой найденной записи заглянуть в объект JSON соответствующей записи.

So I need to join:
SELECT  JSON_RESULT FROM AUT_DB.SSP_STAGE_DB_GATHER
 WHERE RESULT_TYPE = 'TABLESPACE'

с запросом JSON выше

в надежде получить такой результат

DB_NAME TABLESPACE           LOGGING  BIGFILE  USED    FREE    TOTAL   PCT    
------- -------------------- -------- -------- ------- ------- ------- -----
D2647O  AUT_DB_GATHER        LOGGING  YES      0       100     100     100    
D2647O  AUTOMATION_TRAINING  LOGGING  YES      0       100     100     100    
D2647O  AUT_DB_GATHER_LOB    LOGGING  YES      0       100     100     100    
D26470  STAGING              LOGGING  YES      0       100     100     100 
... 
D7788O  SYSTEM               LOGGING  YES      0       100     100     100    
D7788O  AUTOMATION           LOGGING  YES      0       100     100     100  

....

...