按行号将Oracle SQLplus假脱机复制到多个文件
希望将结果输出到多个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
解决方案
SQLPlus没有循环的概念,但您可以创建一个接受参数的SQLPlus脚本,这样您就可以拥有一个包含核心SQL的脚本,比如Extt.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将阻止数据在屏幕上滚动,并在末尾包含一个出口,这样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窗口中并行运行它们中的一组,这样一个就不必等待另一个完成。
使用外部循环生成数字并如上所述调用脚本
[免责声明:如果在易失性来源上使用,不能保证生成一致的结果。]
相关文章