【问题标题】:oracle sqlplus spool to multiple files by row numberoracle sqlplus spool到多个文件的行号
【发布时间】:2016-12-09 16:31:22
【问题描述】:

希望将结果输出到多个 csv 文件并在每个文件的特定行号处截断。尝试了以下但不想创建多个查询。

set colsep ,   
DEFINE SPOOL_BASE_NAME = "spool"
DEFINE PAGE_SIZE = 10
DEFINE PAGE_NO = 1
DEFINE SPOOL_EXT=".csv"
SPOOL &SPOOL_BASE_NAME.&PAGE_NO.&SPOOL_EXT

SELECT *
      FROM   (SELECT a.*,rownum rnum
FROM   (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a
             WHERE  rownum <= &PAGE_SIZE * &PAGE_NO)
      WHERE  rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1;
SPOOL OFF

DEFINE PAGE_NO = 2
SPOOL &SPOOL_BASE_NAME.&PAGE_NO
SELECT *
      FROM   (SELECT a.*,rownum rnum
FROM   (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a
             WHERE  rownum <= &PAGE_SIZE * &PAGE_NO)
      WHERE  rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1;
SPOOL OFF

【问题讨论】:

  • 您必须为此使用SQL*Plus 吗?从SQL*Plus 创建单个文件然后有一个调用SQL*Plus 的批处理脚本然后将文件分解成更小的块似乎要容易得多。或者使用utl_file 从循环中生成文件。
  • 我正在使用 linux,那个批处理文件会是什么样子?
  • 这可能和split -l &lt;&lt;n&gt;&gt; file_name 一样简单,其中&lt;&lt;n&gt;&gt; 是您想要的每个文件的行数theunixschool.com/2012/10/…

标签: oracle sqlplus spool


【解决方案1】:

SQLPlus 没有循环的概念,但您可以创建一个接受参数的 SQLPlus 脚本,这样您就可以拥有一个包含核心 SQL 的脚本,例如 extract.sql,如下所示:

DEFINE SPOOL_BASE_NAME = "spool"
DEFINE PAGE_SIZE = 10
DEFINE PAGE_NO = &1
DEFINE SPOOL_EXT=".csv"
SPOOL &SPOOL_BASE_NAME.&PAGE_NO.&SPOOL_EXT
SET TERM OFF

SELECT *
      FROM   (SELECT a.*,rownum rnum
FROM   (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a
             WHERE  rownum <= &PAGE_SIZE * &PAGE_NO)
      WHERE  rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1;
SPOOL OFF
EXIT

请注意,从命令行运行脚本时,SET TERM OFF 将阻止数据在屏幕上滚动并在末尾包含一个 EXIT,这样 SQLPlus 就不会等待更多输入。

有了这个,你可以从命令行调用它:

sqlplus username/password@database @extract.sql <pagenum>

即:

sqlplus username/password@database @extract.sql 1
sqlplus username/password@database @extract.sql 2
sqlplus username/password@database @extract.sql 3
...

这样做的好处是您可以在不同的终端/cmd 窗口中并行运行一堆,这样一个就不必等待另一个完成。

使用外部循环生成数字并调用上述脚本,

[免责声明:不保证如果在不稳定的源上使用这将产生一致的结果。]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 2019-11-30
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2020-03-31
    • 2023-04-04
    相关资源
    最近更新 更多