【问题标题】:Oracle : Export select statement result set as INSERT SQL Statements similar to SQL developer exportOracle : 将 select 语句结果集导出为类似于 SQL 开发人员导出的 INSERT SQL 语句
【发布时间】:2016-11-30 05:39:23
【问题描述】:

我正在寻找一种解决方案,以使用 PL/SQL 脚本为 select 语句结果集创建 SQL INSERT 语句。寻找 SQL Developer 工具中可用的类似功能(导出 --> 格式插入),但我希望将解决方案作为脚本而不是使用任何工具。

我参考了以下解决方案。但是,我想知道是否有更好的方法来做到这一点,因为解决方案很旧而且不是很简单。

EXPORT AS INSERT STATEMENTS: But in SQL Plus the line overrides 2500 characters!

【问题讨论】:

    标签: oracle plsql oracle-sqldeveloper oracle12c


    【解决方案1】:

    不是真正的 PL/SQL,但基本 SQL 可以处理这样简单的请求:

    set linesize 2000
    set pagesize 0
    spool c:\myoutput.txt
    select 'INSERT INTO SAMPLE_TABLE VALUES ('''||
      C01||''','||C02||','||C03||','||C04||','''||C05||''','''||
      C06||''','''||C07||''','||C08||','||C09||','''||C10||''','''||
      C10||''','''||C11||''','''||C12||''','''||C13||''','''||C14||''','''||
      C15||''','''||C16||''');'
    from sample_table;
    spool off
    

    注意:这是使用您在帖子中引用的 URL 中的表格示例。 URL中的例子中,C02、C03、C04、C08、C09都是NUMBER,其余都是CHAR或VARCHAR2

    【讨论】:

    • 谢谢!实际上,该脚本没有考虑数据类型。
    • 我不清楚你的意思。您需要它来考虑数据类型吗?假设源和目标中此表的 DDL 相同,则数据类型不应该成为问题,因为表的源副本中的所有字段都已满足必要的约束。我可能完全看错了,如果是这样,请原谅我!
    • 示例:如果列中的字符串值有空格,如果没有用单引号括起来,插入脚本将不起作用。
    • 对 - 好点 - 你必须这样做:使用 mytest as (select 'hello there' as myfield from dual) select 'insert into mytable values ('''||我的领域||''');'来自我的测试;我将编辑我的原始帖子以反映字符串
    • 感谢您的帮助!我刚刚找到了一个使用 oracle 提示的简单解决方案。
    【解决方案2】:

    作为你所说的脚本...

    使用SQLcl - 它是 SQL Developer 的命令行界面。

    您可以创建一个 .bat 或 .sh 脚本来启动 SQLcl,运行您的查询,将其假脱机到一个文件中,无需编写任何代码。

    set pagesize...
    set head...
    set feedback...
    spool...
    
    set sqlformat insert
    select * from sample_table;
    spool off
    exit
    

    【讨论】:

      【解决方案3】:

      我刚刚为我的问题找到了一个简单的解决方案使用 oracle 提示(“插入”)。这也会自动处理数据类型。我的表只有字符串和数字数据类型,所以对我来说很好用。我还没有测试其他数据类型的解决方案。不过,我希望它也适用于其他数据类型。

      set linesize 2000
      set pagesize 10
      spool "c:\myoutput.txt";
      select /*insert*/ * from SAMPLE_TABLE;
      spool off;
      

      【讨论】:

      • SQL 开发者和 SQLcl
      【解决方案4】:
      set sqlformat insert
      

      在我的情况下,最初它在 SQL 开发人员中不起作用,因为版本是 3.2 版,并导致脚本输出中出现消息:

      oracle 未知设置选项 sqlformat 插入

      当我升级到 SQL developer 4.2 及更高版本 并使用“运行脚本”(F5) 时,我能够将选择记录导出为插入脚本。

      【讨论】:

        【解决方案5】:

        您可以根据需要使用 for 循环和 dbms 输出来做到这一点,即使是像 Toad 这样的合并语句,只需使缓冲区足够大:

        BEGIN
           FOR r_cur IN (  SELECT column_one,
                                  column_two,
                                  column_three,
                                  column_value
                             FROM some_table
                            WHERE column_one LIKE 'something%'
                         ORDER BY column_one, column_two, column_three)
           LOOP
              DBMS_OUTPUT.put_line (
                    'MERGE INTO some_table A USING
         (SELECT\n
          ''' || r_cur.column_one || ''' as column_one,
          ''' || r_cur.column_two || ''' as column_two,
          ''' || r_cur.column_three || ''' as column_three,
          ''' || r_cur.column_value || ''' as column_value
          FROM DUAL) B
        ON (A.column_one = B.column_one and A.column_two = B.column_two and A.column_three = B.column_three)
        WHEN NOT MATCHED THEN 
        INSERT (
          column_one, column_two, column_three, column_value)
        VALUES (
          B.column_one, B.column_two, B.column_three, B.column_value)
        WHEN MATCHED THEN
        UPDATE SET 
          A.column_value = B.column_value;
        '         );
           END LOOP;
        END;
        /
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-18
          • 2023-03-17
          • 1970-01-01
          相关资源
          最近更新 更多