代码之家  ›  专栏  ›  技术社区  ›  Benoit

Oracle相当于sqlite的quote()函数

  •  3
  • Benoit  · 技术社区  · 14 年前

    有时我想生成 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;
    

    而且,它不适用于空值。

    有更好的方法吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Adam Musch    14 年前

    如果你穿11克,我会用 DBMS_ASSERT.ENQUOTE_LITERAL 而不是自己滚动。

        2
  •  4
  •   Tony Andrews    14 年前

    我看不出您的代码中有任何关于空值的问题。如果存在空值,则插入的值将为“”,这与Oracle中的空值相同(我知道,我知道…)。

    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开发人员这样的工具有一些工具可以生成带有文本的插入,事实上就是这样。

        3
  •  1
  •   Markus Winand    14 年前
        4
  •  1
  •   Andrei Coșcodan    14 年前

    也可以使用Oracle10g中引入的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#');