PL / SQL, как избежать одиночной кавычки в строке?

114

Как в Oracle PL / SQL избежать одиночной кавычки в строке? Я пробовал вот так, не работает.

declare
  stmt varchar2(2000);
begin
  for i in 1021 .. 6020
  loop
    stmt := 'insert into MY_TBL (Col) values(\'ER0002\')';

    dbms_output.put_line(stmt);
    execute immediate stmt;
    commit;
  end loop;
exception
  when others then
    rollback;
    dbms_output.put_line(sqlerrm);
end;
/
user595234
источник
возможный дубликат экранирования одинарной кавычки в PLSQL
Док Браун

Ответы:

184

Вы можете использовать буквальные кавычки:

stmt := q'[insert into MY_TBL (Col) values('ER0002')]';

Документацию для литералов можно найти здесь .

В качестве альтернативы вы можете использовать две кавычки для обозначения одинарной кавычки:

stmt := 'insert into MY_TBL (Col) values(''ER0002'')';

Механизм буквальных кавычек с синтаксисом Q более гибкий и читаемый, IMO.

DCookie
источник
19

Вот сообщение в блоге, которое должно помочь избежать галочки в строках.

Вот простейший метод из указанного сообщения:

Самый простой и наиболее часто используемый способ - использовать одинарные кавычки с двумя одинарными кавычками> с обеих сторон.

ВЫБЕРИТЕ 'тестовую одинарную кавычку' '' из двойного;

Результатом вышеупомянутого оператора будет:

тестовая одинарная кавычка '

Просто укажите, что вам требуется дополнительный символ одиночной кавычки для печати символа одиночной кавычки>. То есть, если вы поместите два символа одинарной кавычки, Oracle напечатает один. Первый> действует как escape-символ.

Это самый простой способ вывода одинарных кавычек в Oracle. Но это станет> сложным, если вам нужно будет напечатать набор кавычек вместо одной. В этой> ситуации следующий метод работает нормально. Но для этого требуется больше печатать.

cboler
источник
13

В дополнение к ответу DCookie выше, вы также можете использовать chr (39) для одинарной кавычки.

Я считаю это особенно полезным, когда мне нужно создать ряд операторов вставки / обновления на основе большого количества существующих данных.

Вот очень быстрый пример:

Допустим, у нас есть очень простая таблица Customers, в которой есть 2 столбца: FirstName и LastName. Нам нужно переместить данные в Customers2, поэтому нам нужно сгенерировать несколько операторов INSERT.

Select 'INSERT INTO Customers2 (FirstName, LastName) ' ||
       'VALUES (' || chr(39) || FirstName || chr(39) ',' || 
       chr(39) || LastName || chr(39) || ');' From Customers;

Я обнаружил, что это очень полезно при перемещении данных из одной среды в другую или при быстром восстановлении среды.

Corwin01
источник
0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; работал у меня. закрытие varchar/ stringс двумя парами одинарных кавычек помогло. Другой вариант мог бы использовать usingключевое слово, EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; usingКлючевое слово Remember не будет работать, если вы используете EXECUTE IMMEDIATEDDL для выполнения с параметрами, однако использование кавычек будет работать для DDL.

Шраван Рамамурти
источник