web-dev-qa-db-fra.com

Échapper à un guillemet simple dans PLSQL

Je veux que PLSQL génère des chaînes comme:

COMMENT ON COLUMN TABLE.COLUMN IS 'comment from database';

Ma solution est:

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 sortie est OK quand elle ne contient pas de qoutes simples dans rec.description. Sinon, il est nécessaire d'avoir une lettre d'échappement. Comment dois-je l'implémenter?

Ligne de sortie OK (il a une lettre d'échappement pour conserver une seule qoute):

COMMENT ON COLUMN TABLE1.COLUMN1_LV  IS 'It''s secret';

PAS de ligne de sortie NOK car aucune lettre d'échappement pour le guillemet simple n'a été ajoutée et ne compile pas:

COMMENT ON COLUMN TABLE1.COLUMN1_LV  IS 'It's secret';

Ma solution n'est pas de vérifier si la description contient des guillemets simples. Je remplace simplement le guillemet simple de la colonne source (description) par deux guillemets simples avant de générer COMMENT ON chaînes et puis je ROLLBACK.

Une meilleure solution?

27
reforrer

Je fais ce genre de truc un peu juste (générant généralement des instructions d'insertion/mise à jour).

Il vous suffit d'utiliser la fonction de remplacement pour activer tous les ' en ''. c'est-à-dire le changer en:

str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name
            ||' IS '''||REPLACE( rec.description,'''','''''')||'''; ' ;
36
Sodved

Vous pouvez utiliser l'opérateur de devis comme

str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name||' IS q''[' ||rec.description|| ']'';' ;

voir http://psoug.org/reference/string_func.html

18
schurik

Utilisez la fonction REPLACE dans votre sélection.

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;
2
dee-see