【问题标题】:Oracle equivalent to SQLite's quote() functionOracle相当于SQLite的quote()函数
【发布时间】:2023-04-11 05:26:01
【问题描述】:

有时我想从数据库表的内容中生成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 值。

有没有更好的办法?

【问题讨论】:

    标签: oracle sqlite query-optimization


    【解决方案1】:

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

    【讨论】:

    • 我在 11.2 上,它似乎没有按照 OP 的要求进行操作。 enquote_literal('a''b') 返回错误,而 enquote_literal('a''''b') 返回 'a''b' 而不是 'a''''b'
    【解决方案2】:

    我认为您的代码中的空值没有任何问题。在有空值的地方插入的值将是'',这与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 Developer 这样的工具实际上可以使用文字生成插入。

    【讨论】:

    • 谢谢。我认为引用函数应该返回'''' || replace (p_text, '''', '''''') || ''''
    【解决方案3】:

    【讨论】:

    • 不确定它对我有帮助。据我了解,绑定参数是在程序中准备 SQL 语句并将参数与查询一起传递时使用的。在这种情况下,我想生成可以复制粘贴到纯 SQL 脚本(在 Toad、Tora、SQL*Plus 或 SQLite shell 中运行)的查询。
    【解决方案4】:

    您也可以使用 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#');
    

    【讨论】:

    • 物有所值,但并不安全!想象一下 col2 的内容是#'); TRUNCATE TABLE foo; --,会发生什么?此外,这仅适用于导入 Oracle 数据库……
    猜你喜欢
    • 2011-01-11
    • 2012-04-26
    • 1970-01-01
    • 2023-02-23
    • 2011-01-07
    • 2013-11-28
    • 1970-01-01
    • 2012-02-21
    • 2018-09-28
    相关资源
    最近更新 更多