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?
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,'''','''''')||'''; ' ;
Vous pouvez utiliser l'opérateur de devis comme
str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name||' IS q''[' ||rec.description|| ']'';' ;
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;