Oracle эквивалентен SQLite функции quote () - PullRequest
3 голосов
/ 01 октября 2010

Иногда я хочу сгенерировать INSERT операторов из содержимого таблицы базы данных.

С SQLite я могу сделать:

SELECT 'INSERT INTO foo (col1, col2) VALUES (' || quote(col1) || ',' || quote(col2) || ');'
  FROM bar;

С Oracle я должен сделать:

SELECT 'INSERT INTO foo (col1, col2) VALUES (''' || replace(col1, '''', '''''') || ''',''' || replace(col2, '''', '''''') || ''');'
  FROM bar;

Более того, он не будет работать со значениями NULL.

Есть ли лучший способ?

Ответы [ 4 ]

4 голосов
/ 01 октября 2010

Если вы на 11g, я бы использовал DBMS_ASSERT.ENQUOTE_LITERAL вместо того, чтобы кататься самостоятельно.

4 голосов
/ 01 октября 2010

Я не вижу проблем с нулями в вашем коде.Там, где есть нули, вставляемое значение будет равно '', что соответствует нулю в Oracle (я знаю, я знаю ...), например,

INSERT INTO foo (col1, col2) VALUES ('XXX','');

, и это работает.

Вы можете создать функцию QUOTE в Oracle следующим образом:

create function quote (p_text varchar2) return varchar2 is
begin
   return '''' || replace (p_text, '''', '''''') || '''';
end;

, и тогда ваш SQLLite SQL будет работать и в Oracle.

Остерегайтесь дат и маски формата по умолчанию: вы потеряете всеинформация о времени в исходной таблице, если вы не установили маску формата по умолчанию для ее включения, например,

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

(Это значение должно быть установлено на то же значение при запуске сценария.)

Я отмечаю мнение Маркуса об использовании переменных связывания, но мне кажется, что это один из тех разовых сценариев, которые запускаются, а затем выбрасываются, а не часть производственного кода, который будет выполняться снова и снова, поэтому я неу меня проблемы с литералами.Такие инструменты, как Toad и SQL Developer, имеют средства для генерации вставок с литералами, как на самом деле.

1 голос
/ 01 октября 2010

Также вы можете использовать оператор Q-quote, представленный в Oracle 10g:

SELECT 'INSERT INTO foo (col1, col2) VALUES (q''#' || col1 || '#'', q''#' || col2 || '#'');'
  FROM bar;

результат:

INSERT INTO foo (col1, col2) VALUES (q'#col1's value#', q'#col2's value#');
1 голос
/ 01 октября 2010

вы должны использовать параметры связывания:

http://use -the-index-luke.com / где-пункт / Bind-параметры

...