web-dev-qa-db-fra.com

PL / SQL, comment échapper à la citation simple dans une chaîne?

Dans Oracle PL/SQL, comment échapper à un guillemet simple 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;
/
98
user595234

Vous pouvez utiliser des citations littérales:

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

Documentation pour les littéraux peut être trouvé ici .

Alternativement, vous pouvez utiliser deux guillemets pour désigner une seule citation:

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

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

165
DCookie

Voici n article de blog qui devrait aider à éviter les ticks dans les chaînes.

Voici la méthode la plus simple de cet article:

La méthode la plus simple et la plus utilisée consiste à utiliser un guillemet simple avec deux guillemets simples des deux côtés.

SELECT 'test single quote' '' de dual;

La sortie de la déclaration ci-dessus serait:

test de devis unique '

Indiquez simplement que vous avez besoin d'un caractère guillemet simple supplémentaire pour imprimer un caractère> guillemet simple. Si vous mettez deux guillemets simples, Oracle en imprimera un. Le premier agit comme un personnage d'échappement.

C'est le 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 bien. Mais cela nécessite un peu plus de travail de dactylographie.

15
cboler

En plus de la réponse de DCookie ci-dessus, vous pouvez également utiliser chr (39) pour un seul devis.

Je trouve cela particulièrement utile lorsque je dois créer un certain nombre d'instructions insert/update basées sur une grande quantité de données existantes.

Voici un exemple très simple:

Select 'UPDATE Customers SET LName = ' || chr(39) || 'Doe' || chr(39) || ';' From dual;
11
Corwin01