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;
/

Відповіді:


184

Ви можете використовувати буквальне цитування:

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

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

Крім того, ви можете використовувати дві лапки для позначення однієї цитати:

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

Механізм буквального котирування з синтаксисом Q є більш гнучким і зрозумілим, IMO.


19

Ось допис у блозі, який повинен допомогти уникнути кліщів у рядках.

Ось найпростіший метод із зазначеного поста:

Найпростіший і найпоширеніший спосіб - це використання одного лапки з двома окремими> лапками в обидві сторони.

ВИБІРТЕ 'тест єдиної цитати' '' з подвійного;

Вихід із зазначеного твердження буде:

тест єдиної цитати '

Просто кажучи, вам потрібен додатковий символ однієї цитати, щоб надрукувати одну цитату> символ. Тобто, якщо ви помістите два символи однієї цитати, Oracle надрукує одну. Перший> діє як символ втечі.

Це найпростіший спосіб друку одиночних лапок в Oracle. Але це стане> складним, коли вам доведеться надрукувати набір лапок замість одного. У цій ситуації наступний метод працює чудово. Але це вимагає ще трохи набирання праці.


13

Крім відповіді DCookie вище, ви можете також використовувати chr (39) для однієї цитати.

Я вважаю це особливо корисним, коли мені доводиться створювати декілька операцій вставки / оновлення на основі великої кількості існуючих даних.

Ось дуже швидкий приклад:

Скажімо, у нас дуже проста таблиця, Клієнти, яка має 2 стовпці, FirstName та LastName. Нам потрібно перемістити дані у Customers2, тому нам потрібно створити купу тверджень INSERT.

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

Я вважаю це дуже корисним при переміщенні даних з одного середовища в інше або при швидкій перебудові середовища.


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ключове слово не буде працювати, якщо ви використовуєте EXECUTE IMMEDIATEдля виконання DDL з параметрами, однак використання лапок буде працювати для DDL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.