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