PL/SQL, ¿cómo escapar de las comillas simples en una cadena?

Resuelto user595234 asked hace 12 años • 5 respuestas

En Oracle PL/SQL, ¿cómo escapar de las comillas simples en una cadena? Lo intenté de esta manera, no funciona.

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;
/
user595234 avatar Jul 03 '12 23:07 user595234
Aceptado

Puedes utilizar citas literales:

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

La documentación para literales se puede encontrar aquí .

Alternativamente, puede utilizar dos comillas para indicar una comilla simple:

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

El mecanismo de cita literal con la sintaxis Q es más flexible y legible, en mi opinión.

DCookie avatar Jul 03 '2012 16:07 DCookie

Aquí hay una publicación de blog que debería ayudar a escapar de las garrapatas en cadenas.

Aquí está el método más simple de dicha publicación:

La forma más sencilla y utilizada es utilizar comillas simples con dos comillas simples en ambos lados.

SELECT 'test single quote''' from dual;

El resultado de la declaración anterior sería:
prueba de comillas simples'

Simplemente indique que necesita un carácter de comilla simple adicional para imprimir un carácter de comilla simple. Es decir, si coloca dos comillas simples, Oracle imprimirá uno. El primero actúa como un personaje de escape.

Esta es la forma más sencilla de imprimir comillas simples en Oracle. Pero se volverá complejo cuando tengas que imprimir un conjunto de comillas en lugar de solo una. En esta situación, el siguiente método funciona bien. Pero requiere más trabajo de mecanografía.

cboler avatar Jul 03 '2012 18:07 cboler

Además de la respuesta anterior de DCookie, también puede usar chr(39) para una comilla simple.

Esto lo encuentro particularmente útil cuando tengo que crear una serie de declaraciones de inserción/actualización basadas en una gran cantidad de datos existentes.

Aquí hay un ejemplo muy rápido:

Digamos que tenemos una tabla muy simple, Clientes, que tiene 2 columnas, Nombre y Apellido. Necesitamos mover los datos a Clientes2, por lo que necesitamos generar un montón de declaraciones INSERT.

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

He descubierto que esto es muy útil al mover datos de un entorno a otro o al reconstruir un entorno rápidamente.

Corwin01 avatar Feb 09 '2018 05:02 Corwin01

En mi caso lo uso así:

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

Añadiendo: q'! antes y !' después de la cuerda.

Esta es otra referencia: Mecanismo de cotización alternativo ("Q") para literales de cadena

nhanhoangle avatar May 22 '2021 06:05 nhanhoangle