terminado - sp en oracle
Escapar una comilla simple en PLSQL (4)
Debe usar '''' en el código Pero antes de probarlo con el código real,
prueba la línea que tiene citas en el dual
Por ejemplo:
select ''''''sumesh'''''' from dual
Quiero que PLSQL genere cadenas como:
COMMENT ON COLUMN TABLE.COLUMN IS ''comment from database'';
Mi solución es:
declare
str_comment varchar2(4000);
begin
for rec in (select table_name, column_name, description from description_table)
loop
str_comment:=''COMMENT ON COLUMN ''||rec.table_name||''.''||rec.column_name||'' IS ''''''||rec.description||''''''; '' ;
dbms_output.put_line(str_comment);
end loop;
end;
La salida está bien cuando no contiene solo qoutes en rec.description
. De lo contrario, hay necesidad de una carta de escape. ¿Cómo debería implementarlo?
Línea de salida OK (Tiene letra de escape para preservar qoute único):
COMMENT ON COLUMN TABLE1.COLUMN1_LV IS ''It''''s secret'';
NO NOK línea de salida porque no se ha agregado una carta de escape para una comilla simple y no se compila:
COMMENT ON COLUMN TABLE1.COLUMN1_LV IS ''It''s secret'';
Mi solución no es verificar si la descripción contiene comillas simples. Solo reemplazo la comilla simple de la columna de fuente (descripción) por dos comillas simples antes de generar COMMENT ON
cadenas y luego ROLLBACK
.
¿Alguna mejor solución?
Hago este tipo de cosas un poco (generalmente generando instrucciones de inserción / actualización).
Solo necesita usar la función de reemplazo para convertir todo en ''''
into ''''
. es decir, cámbialo a:
str_comment:=''COMMENT ON COLUMN ''||rec.table_name||''.''||rec.column_name
||'' IS ''''''||REPLACE( rec.description,'''''''','''''''''''')||''''''; '' ;
Puede usar el operador de Cotización como
str_comment:=''COMMENT ON COLUMN ''||rec.table_name||''.''||rec.column_name||'' IS q''''['' ||rec.description|| '']'''';'' ;
Use la función REPLACE
en su selección.
declare
str_comment varchar2(4000);
begin
for rec in (SELECT table_name, column_name, REPLACE(description, '''''''', '''''''''''')
FROM description_table)
loop
str_comment:=''COMMENT ON COLUMN '' || rec.table_name || ''.''
||rec.column_name|| '' IS '''''' ||rec.description|| ''''''; '' ;
dbms_output.put_line(str_comment);
end loop;
end;