Oracle相当于SQLite的quote()函数

时间:2010-10-01 08:58:58

标签: oracle sqlite query-optimization

有时我想从数据库表的内容生成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 个答案:

答案 0 :(得分:4)

我没有看到代码中的空值有任何问题。如果有空值,则插入的值将为'',这与Oracle中的null相同(我知道,我知道......),例如。

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

并且有效。

您可以在Oracle中创建QUOTE函数,如下所示:

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

(这也需要在运行脚本时设置为相同的值。)

我注意到Marcus关于使用绑定变量的观点,但在我看来,这是一次运行然后丢弃的一次性脚本之一,而不是一些会反复运行的生产代码,所以我文字没有问题。像Toad和SQL Developer这样的工具实际上可以生成带有文字插入的工具。

答案 1 :(得分:4)

如果你使用11g,我会使用DBMS_ASSERT.ENQUOTE_LITERAL而不是自己动手。

答案 2 :(得分:1)

答案 3 :(得分:1)

您也可以使用Oracle 10g中引入的Q-quote运算符:

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#');