Bonjour, d'habitude on vient demander de l'aide sur les forums, mais là j'ai réussi à trouver la solution que je n'ai pas dénichée sur Internet. Je me permets donc de poster un petit article que j'ai rédigé pour moi-même et qui pourrait éventuellement être intégré à la FAQ ou, du moins, servir à quelqu'un d'autre
Citation Envoyé par paidge
La règle : Quand on veut avoir un single quote dans une chaîne de caractère, il faut le doubler pour l'échapper.
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
dbms_output.put_line('Je m''achète une maison');
Dans la table, on veut stocker 'DEC-2012, 'JAN-2012, 'FEB-2012...etc.
Mais comme il s'agit d'une chaîne de caratères, il faut les entourer avec des single quotes.
En toute logique on aurait donc envie d'écrire : ''DEC-2012',''JAN-2012',''FEB-2012'...etc.
Mais cela ne fonctionnera pas.
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
INSERT INTO MaTable(Champs1, champs2) VALUES (''DEC-2012', ''JAN-2012');
En effet, Si on exécute la requête telle quelle, le moteur croira qu'il s'agit de la fin de la chaîne de caractères lorsqu'il tombera sur le 2e single quote et plantera. COmme le montre la coloration syntaxique d'ailleurs

Il faut donc appliquer la règle vue plus haut et écrire : '''DEC-2012', '''JAN-2012', '''FEB-2012',....
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
INSERT INTO MaTable(Champs1, champs2) VALUES ('''DEC-2012', '''JAN-2012');
Cela fonctionnera si on écrit directement la requête dans Toad ou dans un bloc PL/SQL par exemple.

Ici, la requête est stockée dans une variable VARCHAR (pour être exécutée avec EXECUTE IMMEDIATE), donc elle-même entourée par des single quote.
Il faut donc, là encore, échapper chaque single quote avec un autre single quote.
Exemple (qui fonctionne) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
v_maVariable := 'INSERT INTO MaTable(Champs1, champs2) VALUES (''''''DEC-2012'',''''''JAN-2012'')';
EXECUTE IMMEDIATE v_maVariable;
Dans L'exemple ci-dessous, les valeurs DEC-2012, JAN-2012, etc. se trouvent dans une variable. Il faut donc les concaténer comme ceci :
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
v_valeur1 := 'DEC-2012';
v_valeur2 := 'JAN-2012';
v_maVariable := 'INSERT INTO MaTable(Champs1, champs2) VALUES (''''''' || v_valeur1 || ''', ''''''' || v_valeur2 || ''')';
EXECUTE IMMEDIATE v_maVariable;
Autre exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
v_valeur1 := 'DEC-2012';
v_valeur2 := 'JAN-2012';
v_maVariable := 'INSERT INTO MaTable(Champs1, champs2) VALUES (';
v_maVariable := v_maVariable || '''''''' || v_valeur1 || ''',';
v_maVariable := v_maVariable || '''''''' || v_valeur2 || ''')';
EXECUTE IMMEDIATE v_maVariable;