Divida a expressão SQL longa no delimitador

Oct 20 2020

Contexto

Estou tentando importar um dump que tem algumas linhas longas (8k + caracteres) com SQL * Plus, então enfrento o erro SP2-0027: Input is too long (> 2499 characters). Este é um limite embutido em código e não pode ser superado.

Solução esperada

Eu gostaria de transmitir minha entrada em bash e dividir as linhas mais longas do que a largura esperada no último ,caractere (vírgula).

Então, eu deveria ter algo como

cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe

Detalhes

  1. Eu sei que a versão mais recente pode aceitar linhas de até 4999 caracteres, mas ainda tenho linhas mais longas ( cat my_dump.sql | grep '.\{5000\}' | wc -l)
  2. Não é realmente viável atualizar o dump manualmente
  3. Eu tentei usar, trmas isso divide todas as linhas que eu não quero
  4. Eu tentei usar fmte, foldmas não parece ser possível usar um delimitador personalizado
  5. No momento, estou procurando, sedmas não consigo descobrir uma regexp que "encontre a última correspondência entre ,os primeiros 2.500 caracteres se houver mais de 2.500 caracteres"

Respostas

3 JJoao Oct 20 2020 at 10:18

Experimente algo como:

sed -re '/.{2500}/ s/.{,2500},/&\n/g'

Explicação:

  • /.{2500}/ se a linha contém 2500 caracteres (ou mais) ...
  • s/.{,2500},/&\n/gsubstitua até 2500 char seguido pela ,adição de uma nova linha

Eu não ficaria surpreso se isso substituísse algum "," ...

3 muru Oct 20 2020 at 10:20

Imagino que algo como este comando awk funcione:

awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'

O regex permite até 2.498 caracteres antes da vírgula (portanto, 2.499 incluindo a vírgula) e insere uma nova linha depois dela. (Usei 2.499, pois as mensagens de erro mencionam esse número.)