Diviser une expression SQL longue au délimiteur

Oct 20 2020

Le contexte

J'essaye d'importer un dump qui a quelques longues lignes (8k + caractère) avec SQL * Plus, donc je fais face à l'erreur SP2-0027: Input is too long (> 2499 characters). Il s'agit d'une limite codée en dur et ne peut être surmontée.

Solution attendue

Je voudrais diffuser mon entrée en bash et diviser les lignes plus longues que la largeur attendue sur le dernier caractère ,(virgule).

Alors je devrais avoir quelque chose comme

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

Détails

  1. Je sais que la version plus récente peut accepter des lignes jusqu'à 4999 caractères mais j'ai encore des lignes plus longues ( cat my_dump.sql | grep '.\{5000\}' | wc -l)
  2. Il n'est pas vraiment possible de mettre à jour le dump à la main
  3. J'ai essayé d'utiliser trmais cela a divisé chaque ligne dont je ne veux pas
  4. J'ai essayé d'utiliser fmtet foldmais il ne semble pas possible d'utiliser un délimiteur personnalisé
  5. Je recherche actuellement sedmais je n'arrive pas à trouver une expression rationnelle qui "trouverait la dernière correspondance ,dans les 2500 premiers caractères s'il y a plus de 2500 caractères"

Réponses

3 JJoao Oct 20 2020 at 10:18

Essayez quelque chose comme:

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

Explication:

  • /.{2500}/ si la ligne contient 2500 caractères (ou plus) ...
  • s/.{,2500},/&\n/gremplacez jusqu'à 2500 caractères suivi d'un ,ajout d'une nouvelle ligne

Je ne serais pas surpris si cela remplace certains "," ...

3 muru Oct 20 2020 at 10:20

J'imagine que quelque chose comme cette commande awk fonctionnerait:

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

Le regex autorise jusqu'à 2498 caractères avant une virgule (donc 2499 avec la virgule), et insère une nouvelle ligne après elle. (J'ai utilisé 2499 car les messages d'erreur mentionnent ce nombre.)