PL / SQL, comment échapper les guillemets simples dans une chaîne?


114

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:


184

Vous pouvez utiliser des guillemets littéraux:

stmt := q'[insert into MY_TBL (Col) values('ER0002')]';

La documentation des littéraux peut être trouvée ici .

Vous pouvez également utiliser deux guillemets pour désigner un guillemet simple:

stmt := 'insert into MY_TBL (Col) values(''ER0002'')';

Le mécanisme de guillemet littéral avec la syntaxe Q est plus flexible et plus lisible, IMO.


19

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:

Le moyen le plus simple et le plus utilisé consiste à utiliser un guillemet simple avec deux guillemets simples> des deux côtés.

SELECT 'tester le guillemet simple' '' à partir du double;

Le résultat de l'instruction ci-dessus serait:

tester le guillemet simple '

Indiquant simplement que vous avez besoin d'un caractère guillemet simple supplémentaire pour imprimer un caractère guillemet simple>. C'est-à-dire que si vous mettez deux guillemets simples, Oracle en imprimera un. Le premier agit comme un caractère d'échappement.

Il s'agit du moyen le plus simple d'imprimer des guillemets simples dans Oracle. Mais cela deviendra> complexe lorsque vous devrez imprimer un ensemble de guillemets au lieu d'un seul. Dans cette situation, la méthode suivante fonctionne très bien. Mais cela nécessite un peu plus de travail de frappe.


13

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.

Select 'INSERT INTO Customers2 (FirstName, LastName) ' ||
       'VALUES (' || chr(39) || FirstName || chr(39) ',' || 
       chr(39) || LastName || chr(39) || ');' From Customers;

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.


0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; travaillé pour moi. fermer le varchar/ stringavec deux paires de guillemets simples a fait l'affaire. Une autre option pourrait être d'utiliser des usingmots clés, EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; N'oubliez pas que le usingmot-clé ne fonctionnera pas, si vous utilisez EXECUTE IMMEDIATEpour exécuter des DDL avec des paramètres, cependant, l'utilisation de guillemets fonctionnera pour les DDL.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.