web-dev-qa-db-fra.com

insérer une chaîne multiligne dans Oracle avec sqlplus

J'ai un script SQL qui va insérer une longue chaîne dans une table. La chaîne contient une nouvelle ligne (et cette nouvelle ligne est absolument nécessaire). Ainsi, lorsqu'elle est écrite dans un fichier texte, la requête est scindée en plusieurs lignes. Quelque chose comme:

insert into table(id, string) values (1, 'Line1goesHere 

Line2GoesHere 
blablablabla
');

Cela fonctionne bien dans Toad, mais lorsque je l'enregistre en tant que fichier .sql et que je l'exécute à l'aide de sqlplus, il considère chaque ligne comme une requête distincte, ce qui signifie que chaque ligne échouera (beacuse insert into table(id, string) values (1, 'Line1goesHere, Line2GoesHere ne sont pas des scripts bien formatés.

SP2-0734: unknown command beginning "Line2GoesHere" - rest of line ignored.

Y'a t'il un moyen d'arranger cela?

29
Louis Rhys

Activez SQLBLANKLINES pour autoriser les lignes vides dans les instructions SQL. Par exemple:

SET SQLBLANKLINES ON
insert into table(id, string) values (1, 'Line1goesHere 
Line2GoesHere 

blablablabla
');

La prémisse de cette question est légèrement fausse. SQL * Plus autorise les chaînes multilignes par défaut. Ce ne sont que les lignes vides qui posent problème.

49
jim mcnamara

Vous pouvez également utiliser la fonctionnalité peu connue des chaînes de caractères SQL Oracle: de style Perl.

SQL> select q'[f dfgdfklgdfkjgd
  2  sdffdslkdflkgj dglk
  3  glfdglkjdgkldj ]'
  4  from dual;

Q'[FDFGDFKLGDFKJGDSDFFDSLKDFLKGJDGLKGLFDGLKJDGKLDJ]'
----------------------------------------------------
f dfgdfklgdfkjgd
sdffdslkdflkgj dglk
glfdglkjdgkldj
6
ibre5041

Manuel SQL * Plus

Vous pouvez mettre fin à une commande SQL de trois manières différentes:

  1. avec un point-virgule (;)
  2. avec une barre oblique (/) sur une ligne à part
  3. avec une ligne blanche

Une ligne vide dans une instruction ou un script SQL indique à SQL * Plus que vous avez fini d'entrer la commande, mais vous ne voulez pas l'exécuter pour le moment. Presse Retourne à la fin de la dernière ligne de la commande.

Activer SQLBLANKLINES dans cette situation peut être la solution, mais vous devez quand même vous inquiéter des commandes SQL * Plus suivantes.

@  ("at" sign)        (Start of line) 
@@ (double "at" sign) (Start of line) 
#   SQLPREFIX         (Start of line)
.   BLOCKTERMINATOR   (Start of line and by itself)
/  (slash)            (Start of line and by itself)
;   SQLT[ERMINATOR]   (Start of line and by itself, or at the end)

SQLPREFIX est quelque chose que vous ne pouvez pas désactiver; c'est une fonctionnalité de SQL * Plus. BLOCKTERMINATOR peut être activé ou désactivé. La barre oblique, par contre, si elle apparaît au début d'une nouvelle ligne, elle exécutera le contenu dans la mémoire tampon. SQL [TERMINATOR] a un comportement similaire.

3
Chad

Une autre façon d'insérer des nouvelles lignes dans une chaîne est la concaténation: 

chr(13)||chr(10)

(sur les fenêtres)

ou juste: 

chr(10)

(autrement)

0
A.B.Cade