Imprimir este capítuloImprimir este capítulo

Data Lake

3. Importar ou Exportar

3.1. Extração metadados Oracle

É possível utilizar o Pentaho Data Integration para importar os metadados, criamos um plug-in que facilita esta ação. Desta forma basta criar uma conexão com o Banco de dados Oracle, selecionar as tabelas de metadados do Oracle e executar a transformação. Utilize o Link para baixar um exemplo desta transformação pronta.

Abaixo uma query de como extrair as informações do metadados do Oracle e a partir dela gerar um arquivo no formato formato CSV para para ser importada como explica a capítulo anterior.

SELECT trim(UPPER(COL.TABLE_NAME)) AS TABLE_INTERNALNAME,
    trim(UPPER(COL.TABLE_NAME)) AS TABLE_NAME,
    TAB_COMN.COMMENTS AS TABLE_COMMENT,
    '' AS TABLE_TAGS,
    trim(UPPER(COL.COLUMN_NAME)) AS COLUMN_INTERNALNAME,
    trim(UPPER(COL.COLUMN_NAME)) AS COLUMN_NAME,
    COL_COMN.COMMENTS AS COLUMN_COMMENT,
    '' AS COLUMN_TAGS,
    CASE WHEN DATA_TYPE IN ('VARCHAR2','CHAR','CLOB') THEN '1' --> String
         WHEN DATA_TYPE IN ('NUMBER') AND DATA_SCALE = 0 AND DATA_PRECISION <= 9 then '2' --> Int (Number, Não possui casas decimais e é menor que oito pocisões)
         WHEN DATA_TYPE IN ('NUMBER') AND DATA_SCALE = 0 then '9' --> Bigint (Number, Não possui casas decimais e é maior que oito pocisões)
         WHEN DATA_TYPE IN ('NUMBER') AND (DATA_PRECISION-DATA_SCALE) <= 17 THEN '4'   --Number
         WHEN DATA_TYPE IN ('NUMBER') THEN '8' --BigNumber
         WHEN DATA_TYPE IN ('DATE') THEN '3' --DateTime
         WHEN DATA_TYPE IN ('TIMESTAMP(6)') THEN '3' --> Date Time
         WHEN DATA_TYPE IN ('INTERVAL DAY(2) TO SECOND(6)') THEN '1' -- STRING
    END AS COLUMN_DATATYPE, --> Data Type
    CASE  
         WHEN DATA_TYPE IN ('VARCHAR2','CHAR','CLOB') THEN TO_CHAR(DATA_LENGTH)
         WHEN DATA_TYPE IN ('NUMBER') AND DATA_SCALE = 0 THEN '0' --> Int ou Bigint (não é necessário especificar o tamanho do campo)
         WHEN DATA_TYPE IN ('NUMBER') AND DATA_PRECISION IS NOT NULL THEN TO_CHAR(DATA_PRECISION)  
         WHEN DATA_TYPE IN ('NUMBER') AND DATA_PRECISION IS NULL THEN TO_CHAR(DATA_LENGTH) 
         WHEN DATA_TYPE IN ('DATE') THEN TO_CHAR(DATA_LENGTH)  
         WHEN DATA_TYPE IN ('TIMESTAMP(6)') THEN '' 
         WHEN DATA_TYPE IN ('INTERVAL DAY(2) TO SECOND(6)') THEN '20' -- STRING 20
    END AS COLUMN_SIZE,  --> Tamanho do campo
    CASE WHEN DATA_TYPE IN ('NUMBER') AND DATA_SCALE IS NOT NULL THEN TO_CHAR(DATA_SCALE)
         WHEN DATA_TYPE IN ('NUMBER') AND DATA_SCALE IS NULL THEN '0'
    ELSE  '0' 
    END AS COLUMN_PRECISION, --> Casas decimais
    CASE NULLABLE 
        WHEN 'N' THEN '0'
        WHEN 'Y' THEN '1'
    END AS COLUMN_NULLABLE,
    '0' COLUMN_PARTITIONED
    FROM ALL_TAB_COLUMNS COL
    LEFT JOIN all_TAB_comments TAB_COMN ON (COL.OWNER = TAB_COMN.OWNER AND COL.TABLE_NAME = TAB_COMN.TABLE_NAME)
    LEFT join all_COL_comments COL_COMN ON (COL.OWNER = COL_COMN.OWNER AND COL.TABLE_NAME = COL_COMN.TABLE_NAME AND COL.COLUMN_NAME = COL_COMN.COLUMN_NAME)
  WHERE COL.TABLE_NAME in ('TABLE 1','TABLE 2') --> Substitua aqui a lista das tabelas a serem importadas
  and col.owner in ('OWNER 1','OWNER 2') --> Substitua aqui a lista de Owners a serem importados
  order by UPPER(COL.TABLE_NAME), COL.COLUMN_ID