oracle sqlplus按行号将线轴换成多个文件

时间:2016-08-03 19:39:23

标签: oracle sqlplus spool

希望将结果输出到多个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

1 个答案:

答案 0 :(得分: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窗口中并行运行它们,这样就不会等待另一个终结。

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

[免责声明:如果在易变源上使用,则不保证会产生一致的结果。]