2016-08-03 10 views
0

結果を複数のcsvファイルに出力し、各ファイルの特定の行番号で切り捨てたい。以下を試してみましたが、複数のクエリを作成したくありません。oracle sqlplus行番号別に複数のファイルにスプールする

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 
+2

あなたは 'を使用する必要がありますかSQL * Plus'これは? 'SQL * Plus'から単一のファイルを作成してから、' SQL * Plus'を呼び出してファイルを小さなまとまりに分割するバッチスクリプトを作成する方がはるかに簡単です。あるいは、 'utl_file'を使ってループ内からファイルを生成してください。 –

+0

私はlinuxを使っていますが、そのバッチファイルはどのように見えますか? – Dom

+0

'split -l <> file_name'と同じくらい簡単です。ここで' <>はファイルごとに必要な行の数です。http://www.theunixschool.com/2012/10/10-examples-of-split -command-in-unix.html –

答えて

0

SQLPlusを、ループの概念を持っていませんが、あなたはコアSQLとスクリプトを持つことができますので、あなたはパラメータを受け入れるのSQLPLUSスクリプトを作成することができ、以下のように見えること、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は、画面上のことでスクロールからデータを防ぐことができますし、SQLPlusをは複数の入力を待っているの周りにハングdoens'tので最後にEXITが含まれていることに注意してください。つまり

sqlplus username/[email protected] @extract.sql <pagenum> 

:としてこれにより

コマンドラインから呼び出すことができ

sqlplus username/[email protected] @extract.sql 1 
sqlplus username/[email protected] @extract.sql 2 
sqlplus username/[email protected] @extract.sql 3 
... 
これのボーナスはあなたが別のに並行して、それらの束を実行することができるということです

ターミナル/ cmdウィンドウを開き、もう一方が終了するのを待たないようにします。番号を生成し、上記のようにスクリプトを呼び出すには、外部ループで

[免責事項:揮発性のソースで使用された場合は保証これは一貫した結果を生成します]

関連する問題