Dans Oracle PL / SQL, comment échapper les guillemets simples dans une chaîne? J'ai essayé de cette façon, ça ne marche pas.
declare
stmt varchar2(2000);
begin
for i in 1021 .. 6020
loop
stmt := 'insert into MY_TBL (Col) values(\'ER0002\')';
dbms_output.put_line(stmt);
execute immediate stmt;
commit;
end loop;
exception
when others then
rollback;
dbms_output.put_line(sqlerrm);
end;
/
Réponses:
Vous pouvez utiliser des guillemets littéraux:
La documentation des littéraux peut être trouvée ici .
Vous pouvez également utiliser deux guillemets pour désigner un guillemet simple:
Le mécanisme de guillemet littéral avec la syntaxe Q est plus flexible et plus lisible, IMO.
la source
Voici un article de blog qui devrait vous aider à échapper les graduations dans les chaînes.
Voici la méthode la plus simple de ce post:
la source
En plus de la réponse de DCookie ci-dessus, vous pouvez également utiliser chr (39) pour un guillemet simple.
Je trouve cela particulièrement utile lorsque je dois créer un certain nombre d'instructions d'insertion / mise à jour basées sur une grande quantité de données existantes.
Voici un exemple très rapide:
Disons que nous avons une table très simple, Clients, qui a 2 colonnes, FirstName et LastName. Nous devons déplacer les données dans Clients2, nous devons donc générer un tas d'instructions INSERT.
J'ai trouvé cela très utile lors du transfert de données d'un environnement à un autre ou lors de la reconstruction rapide d'un environnement.
la source
EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'
; travaillé pour moi. fermer levarchar
/string
avec deux paires de guillemets simples a fait l'affaire. Une autre option pourrait être d'utiliser desusing
mots clés,EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'
; N'oubliez pas que leusing
mot-clé ne fonctionnera pas, si vous utilisezEXECUTE IMMEDIATE
pour exécuter des DDL avec des paramètres, cependant, l'utilisation de guillemets fonctionnera pour les DDL.la source