Forum Programmation.autre Oracle et les caractères spéciaux

Posté par  .
Étiquettes : aucune
0
24
mai
2005
Bonjour,

Je dois insérer des tuples dans une base de données Oracle 9i.
Ces données comportent des champs de texte longs, pouvant fréquemment contenir des sauts de lignes (que je je peux constater d'ailleurs dans le script INSERT par des lignes vides ou des retours chariots).

Le hic, c'est que Oracle me retourne une erreur lors de l'exécution du script, car il me refuse les caractères genre "&" ou sauts de lignes. En fait, pour le saut de ligne, il considère que l'on passe à une commande suivante si il rencontre une ligne vide.

Comment faire donc, pour insérer ces données (car je veux conserver les caractères "&" et les retours de chariot) sans erreur ni perte (l'erreur empêche l'insertion du tuple incriminé) ??

Merci par avance... ;)
  • # BLOB....

    Posté par  . Évalué à 2.

    Euh, je sais pas comment tu passes tes commandes à Oracle, mais il me semble (dans mes souvenirs) qu'il y a des fonction d'OCI spécifiques à l'insertion de champ de type BLOB (Binary Large OBject).

    Il faut aussi faire attention que la gestion des BLOBs dans Oracle diffère en fonction de la version utilisée.
    • [^] # Re: BLOB....

      Posté par  . Évalué à 1.

      Je vais regarder du côté des BLOB... mais ça m'étonnerait que ça vienne de là.
      En fait, j'ai juste des champs de 2000 caractères maxi, mais ils contiennent des caractères mal reconnus (ou réservés).

      Pour passer le tout à Oracle, j'utilise le client SQL *Plus Worksheet de base...
  • # Utilise CHR

    Posté par  (site web personnel) . Évalué à 2.

    CHR(Code_Ascii)

    pour & -> CHR(38)
    • [^] # Re: Utilise CHR

      Posté par  . Évalué à 1.

      C'est pas une mauvaise idée... mais ça marche aussi pour le cas des doubles sauts de lignes ?? (ou bien en mettant deux fois CHR(code_du_char_saut_de_ligne) ? )
      • [^] # Re: Utilise CHR

        Posté par  . Évalué à 1.

        J'arrive pas à insérer un CHR(code) dans mon script... Il y a un opérateur spécial pour la concaténation de caractères sous SQLplus ?

        Exemple:
        INSERT INTO table (truc, machin) VALUES ('3', 'debutchaine' + CHR(38) + 'finchaine');
        • [^] # Re: Utilise CHR

          Posté par  . Évalué à 1.

          ouaip, pour concaténer deux chaines, tu as la fonction CONCAT ou l'opérateur ||
          mais dans la clause values d'un insert, t'y as pas droit.
          tu peux contourner en faisant un
          insert into table (truc, machin)
          select '3', 'debutchaine' || chr(38) || 'finchaine'
          from dual;


          bon je dis ça pour parler de la concaténation de chaine, vu que pour virer les &, c'est plus simple de jouer sur le set define (cf ci dessous).
  • # sqlplus: set define off

    Posté par  . Évalué à 2.

    le caractère & sert pour la substitution des paramètres de la ligne de commande.
    Pour désactiver cette substitution, tu peux faire un
    set define off


    pour les retours chariots ... je ne sais pas trop.
    • [^] # Re: sqlplus: set define off

      Posté par  . Évalué à 1.

      Merci, ça marche nickel pour les & !!
      Maintenant, il me reste à trouver les sauts de ligne... Je pense que ça va se finir en remaniement des données "a la mano"... :(
      • [^] # Re: sqlplus: set define off

        Posté par  . Évalué à 1.

        bon je viens de faire un petit test rapide. Ou est le problème avec les retours chariot. Ici, un bête
        insert into tablee (bidule, machin)
        values ('une ligne', 'deux
        ligne');

        fonctionne.
        • [^] # Re: sqlplus: set define off

          Posté par  . Évalué à 1.

          Oui, ça passe aussi chez moi, ce qui ne passe pas, c'est les doubles retours chariot (sournoise, l'anomalie !!).
          Pour reprendre ton exemple, ceci ne marche pas:
          insert into tablee (bidule, machin)
          values ('une ligne', 'deux

          ligne');


          La ligne vide est considérée comme un changement de commande, et il me répond qu'il ne connaît pas la commande ligne...
          • [^] # Re: sqlplus: set define off

            Posté par  . Évalué à 2.

            okayyy
            bon, une solution qui marche chez moi:
            insert into tablee(bidule, machin)
            values ('une ligne', 'trois
            '||'
            ligne');


            un bon coup de sed pour traiter les lignes vides et c'est fini ! :)
            • [^] # Re: sqlplus: set define off

              Posté par  . Évalué à 1.

              Superbe, merci, ça marche nickel !!

              Il ne me reste plus qu'à chercher à remplacer les caractères Euro qui sont transformés en '?' par mon appli qui génère le script d'insertion...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.