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

114

En Oracle PL / SQL, ¿cómo escapar de las comillas simples en una cadena? 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;
/
usuario595234
fuente
posible duplicado de Escapar comilla simple en PLSQL
Doc Brown

Respuestas:

184

Puede usar citas literales:

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

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

Alternativamente, puede usar dos comillas para denotar una sola comilla:

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

El mecanismo de cotización literal con la sintaxis Q es más flexible y legible, IMO.

DCookie
fuente
19

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

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

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

SELECCIONE 'probar comillas simples' '' de dual;

El resultado de la declaración anterior sería:

prueba comilla simple '

Simplemente indicando que necesita un carácter de comilla simple adicional para imprimir un carácter de comilla simple>. Es decir, si coloca dos caracteres de 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 tenga que imprimir un conjunto de comillas en lugar de solo una. En esta situación, el siguiente método funciona bien. Pero requiere un poco más de trabajo de mecanografía.

cboler
fuente
13

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

Encuentro esto 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 cuando se mueven datos de un entorno a otro o cuando se reconstruye un entorno rápidamente.

Corwin01
fuente
0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; trabajó para mi. cerrar la varchar/ stringcon dos pares de comillas simples funcionó. Otra opción podría ser utilizar la usingpalabra clave EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; Recuerde que la usingpalabra clave no funcionará, si está utilizando EXECUTE IMMEDIATEpara ejecutar DDL con parámetros, sin embargo, usar comillas funcionará para DDL.

Shravan Ramamurthy
fuente