Подтвердить что ты не робот

Исключение одиночной кавычки в PLSQL

Я хочу, чтобы 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;

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

Выходная строка OK (для сохранения одного qoute имеет escape-букву):

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

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

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

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

Лучшее решение?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Используйте функцию 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;

Ответ 4

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

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

Например:

select '''sumesh''' from dual