Este script bash faz a extração dos dados para o Oracle DB (outro servidor), processa-os e insere-os no MariaDB (meu servidor), mas a inserção fica desalinhada e deixa algumas colunas em branco.
Este é o código:
#!/bin/bash
ORACLE_USER="user"
ORACLE_PASSWORD="password"
ORACLE_DB="IP/SID"
MYSQL_USER="user"
MYSQL_PASSWORD="password"
MYSQL_DB="DB"
echo "Fetching data from Oracle..."
ORACLE_DATA=$(sqlplus -s "$ORACLE_USER/$ORACLE_PASSWORD@$ORACLE_DB" <<EOF
SET PAGESIZE 50000
SET COLSEP '|'
SET LINESIZE 1000
SET HEADING OFF
SET FEEDBACK OFF
SET TERMOUT OFF
select TRIM(REGION), TRIM(CENTRAL), TRIM(NOMBRE_BANCO), TRIM(MODELO), TRIM(BATERIA), TRIM(TECNOLOGIA_ID), TRIM(AMPERAJE_CA), TO_CHAR(MEDIDO, 'YYYY-MM-DD') AS MEDIDO, TRIM(PORCENTAJE), TRIM(VOLTAJE), TRIM(VOLTAJE_AC), TO_CHAR(CREADO, 'YYYY-MM-DD') AS CREADO
from SIMBA_BD.VIEW_CENTRAL_MEDICIONES_PLOMO where rownum<=10;
EXIT;
EOF
)
echo "Data fetched from Oracle:"
echo "$ORACLE_DATA"
echo "Truncating the MariaDB table..."
mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DB" <<EOF
TRUNCATE TABLE SIMBA;
EOF
echo "Inserting data into MariaDB..."
while IFS='|' read -r REGION CENTRAL NOMBRE_BANCO MODELO BATERIA TECNOLOGIA_ID AMPERAJE_CA MEDIDO PORCENTAJE VOLTAJE VOLTAJE_AC CREADO; do
REGION=$(echo "$REGION" | tr -d '\r\n')
CENTRAL=$(echo "$CENTRAL" | tr -d '\r\n')
NOMBRE_BANCO=$(echo "$NOMBRE_BANCO" | tr -d '\r\n')
MODELO=$(echo "$MODELO" | tr -d '\r\n')
BATERIA=$(echo "$BATERIA" | tr -d '\r\n')
TECNOLOGIA_ID=$(echo "$TECNOLOGIA_ID" | tr -d '\r\n')
AMPERAJE_CA=$(echo "$AMPERAJE_CA" | tr -d '\r\n')
MEDIDO=$(echo "$MEDIDO" | tr -d '\r\n')
PORCENTAJE=$(echo "$PORCENTAJE" | tr -d '\r\n')
VOLTAJE=$(echo "$VOLTAJE" | tr -d '\r\n')
VOLTAJE_AC=$(echo "$VOLTAJE_AC" | tr -d '\r\n')
CREADO=$(echo "$CREADO" | tr -d '\r\n')
REGION=${REGION:-""}
CENTRAL=${CENTRAL:-""}
NOMBRE_BANCO=${NOMBRE_BANCO:-""}
MODELO=${MODELO:-""}
BATERIA=${BATERIA:-""}
TECNOLOGIA_ID=${TECNOLOGIA_ID:-""}
AMPERAJE_CA=${AMPERAJE_CA:-0}
MEDIDO=${MEDIDO:-"NULL"}
PORCENTAJE=${PORCENTAJE:-0}
VOLTAJE=${VOLTAJE:-0}
VOLTAJE_AC=${VOLTAJE_AC:-0}
CREADO=${CREADO:-"NULL"}
echo "Region: $REGION"
echo "Central: $CENTRAL"
echo "Nombre_Banco: $NOMBRE_BANCO"
echo "Modelo: $MODELO"
echo "Bateria: $BATERIA"
echo "Tecnologia: $TECNOLOGIA_ID"
echo "Amperaje_CA: $AMPERAJE_CA"
echo "Medido: $MEDIDO"
echo "Porcentaje: $PORCENTAJE"
echo "Voltaje: $VOLTAJE"
echo "Voltaje_AC: $VOLTAJE_AC"
echo "Creado: $CREADO"
if ! [[ "$MEDIDO" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
MEDIDO="NULL"
fi
if ! [[ "$CREADO" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
CREADO="NULL"
fi
if ! [[ "$AMPERAJE_CA" =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
AMPERAJE_CA=0
fi
if ! [[ "$PORCENTAJE" =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
PORCENTAJE=0
fi
if ! [[ "$VOLTAJE" =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
VOLTAJE=0
fi
if ! [[ "$VOLTAJE_AC" =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
VOLTAJE_AC=0
fi
mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DB" <<EOF
INSERT INTO SIMBA (Region, Central, Nombre_Banco, Modelo, Bateria, Tecnologia, Amperaje_CA, Medido, Porcentaje, Voltaje, Voltaje_AC, Creado) VALUES ('$REGION', '$CENTRAL', '$NOMBRE_BANCO', '$MODELO', '$BATERIA', '$TECNOLOGIA_ID', '$AMPERAJE_CA', IF('$MEDIDO' = 'NULL', NULL, '$MEDIDO'), '$PORCENTAJE', '$VOLTAJE', '$VOLTAJE_AC', IF('$CREADO' = 'NULL', NULL, '$CREADO'));
EOF
done <<< "$ORACLE_DATA" >> SALIDA.TXT
echo "Data insertion completed."
E os resultados são assim:
Region:
Central:
Nombre_Banco:
Modelo:
Bateria:
Tecnologia:
Amperaje_CA:
Medido:
Porcentaje:
Voltaje:
Voltaje_AC:
Creado:
Region: REGION 7
Central: LERFIC
Nombre_Banco: 7LERFICCT1B6
Modelo: BATERIA GNB ABSOLYTE, 100A-19 896AH
Bateria:
Tecnologia:
Amperaje_CA:
Medido:
Porcentaje:
Voltaje:
Voltaje_AC:
Creado:
Region: J10B
Central: TYPHOON(TY1)
Nombre_Banco: 0
Modelo: 2016-12-30
Bateria: 54.45
Tecnologia: 2.25
Amperaje_CA: 0
Medido: 2017-01-10
Porcentaje:
Voltaje:
Voltaje_AC:
Creado:
Dei uma olhada nisso e é uma confusão; não deveríamos consertar isso; a ideia de pegar dados não higienizados de um sistema de banco de dados, deixar o banco de dados imprimi-los como uma tabela e então analisar essa tabela em um script de shell para então gerar inserções SQL é muito complicada e propensa a erros.
Este poderia ser um programa muito menor em quase qualquer outra linguagem de script, onde você não precisa obter as linhas do resultado da consulta do banco de dados como texto e então dividi-las de volta nos valores usando a sintaxe menos útil para isso.
Por exemplo, em python você poderia simplesmente fazer a consulta e então literalmente ir e inserir todos os resultados após a filtragem de uma só vez. Uma única linha de código.
Receio que às vezes a resposta honesta para "como consertar meu script de shell" seja que você precisa parar de usar o shell para coisas para as quais ele realmente não foi criado.
Há outras armadilhas que você evitaria fazendo isso e usando as instruções preparadas apropriadas em vez de construir sua própria
insert(…) … VALUES($VARIABLE1, $VARIABLE2,…)
string. Todo mundo ama Bobby Tables:XKCD 237 : "Exploits of a Mom" por Randall Munroe; sob CC-by-NC 2.5