Экранирование одинарной кавычки в PLSQL - PullRequest
26 голосов
/ 13 июля 2011

Я хочу, чтобы PLSQL генерировал строки, такие как:

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

Мое решение:

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;

Вывод в порядке, если он не содержит одиночных кавычек в rec.description.В противном случае необходимо получить управляющее письмо.Как мне это реализовать?

ОК, строка вывода (в ней есть escape-буква для сохранения одиночного qoute):

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

NOT NOK строка вывода, потому что не добавлена ​​escape-буква для одинарной кавычки и не 't compile:

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

Мое решение - не проверять, содержит ли описание одинарные кавычки.Я просто заменяю одиночную кавычку столбца источника (описания) двумя одинарными кавычками перед генерацией COMMENT ON строк, а затем я ROLLBACK.

Любое лучшее решение?

Ответы [ 4 ]

35 голосов
/ 13 июля 2011

Я делаю такие вещи неплохо (обычно генерирую операторы вставки / обновления).

Вам просто нужно использовать функцию замены, чтобы превратить все ' в ''. то есть измените его на:

str_comment:='COMMENT ON COLUMN '||rec.table_name||'.'||rec.column_name
            ||' IS '''||REPLACE( rec.description,'''','''''')||'''; ' ;
17 голосов
/ 13 июля 2011

Вы можете использовать оператор котировки, как

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

см. http://psoug.org/reference/string_func.html

2 голосов
/ 13 июля 2011

Используйте функцию REPLACE для выбора.

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;
0 голосов
/ 08 июня 2012

Вам необходимо использовать '' в коде Но перед тем, как перейти к реальному коду,

попробуйте строку с кавычками в двойном

Например:

select '''sumesh''' from dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...